本文只探讨正则在php中的一些使用,小白用户还是先了解下正则相关的基础概念:正则表达式30分钟入门教程
一、正则基础函数
|
|
二、正则表达式基本语法
正则表达式基本语法归类:
- 界定符: 表示一个正则表达式的开始和结束;EG:/[0-9]/; eg: $pattern = ‘/[0-9]/‘ 或者 #[0-9]# {[0-9]}(不推荐使用大括号);
- 原子: 原装可以分为可见原子和不可见原子,都能用正则表达式进行原子匹配。
- 可见原子:Unicode编码表中用键盘输出后肉眼可见的字符, 比如
- 标点 _ ;,?等等
- 英文字母和数字
- 汉字/日文等其他语言文字
- 求和等数理化公式符号
- 其他可见字符
- 特殊原子:\ 因为本身还是转义字符,所以要用\才能匹配到一个\符号
- 不可见原子:Unicode编码表中用键盘输出后肉眼不可见的字符
- 换行符 \n
- 回车符 \r
- 制表符 \t
- 空格
- 其他不可见符号
- 元字符:
[] -> 匹配出现在[]中的任意一个原子
| -> 或运算,匹配|符号左右两边的任意一个
[^ ] ->首先这里^必须和[紧挨着,才表示匹配除了[]里面任意原子的字符
[ ^ ]->如果不挨着,就只表示匹配^这种字符了 - 原子的集合:
.
匹配除换行符之外的任意字符。等价于[^\n]。\d
匹配任意一个十进制数字,即[0-9]。\D
匹配任意一个非十进制数字,即[^0-9]。\s
匹配一个不可见原子,即[\f\n\r\t\v]。\S
匹配一个可见原子,即[^\f\n\r\t\v]。\w
匹配任意一个数字,字母或下划线,即[0-9a-zA-Z_]。\W
匹配任意一个非数字,字母或是下划线,即[^0-9a-zA-Z_]。
- 可见原子:Unicode编码表中用键盘输出后肉眼可见的字符, 比如
- 量词
{n}
表示其前面的原子恰好出现n次。{n,}
表示其前面的原子最少出现n次。{n,m}
表示其前面的原子最少出现n次,最多出现m次。- `` 匹配0次,1次,或者多次其之前的原子,即{0,}。 ? ???????
+
匹配1次,或者多次其之前的原子,即{1,}。?
匹配0次,1次,或者1次其之前的原子,即{0,1}。备注:量词不仅支持原子,同样支持原子的集合,同样支持元字符的写法。例如:\w{4}
- 边界控制
^
匹配字符串开始的位置$
匹配字符串结尾的位置
- 模式单元
()
匹配其中的整体为一个原子, 例如:(H|h)ello则匹配Hello和hello的结果。
- 修正模式
- 贪婪匹配: 匹配结果存在歧义时取其长
- 懒惰匹配: 匹配结果存在歧义时取其短
- 常见的修正模式:
U
懒惰匹配i
忽略英文字母大小写x
忽略空白(空格,制表符等空白符)s
让元字符’.’匹配包括换行符在内的所有字符e
后面单独写下~惰模式的标识为大写的U
例如:
$pattern = ‘/hello.+12/‘;
$subject = ‘hello1231321233123131’;
在贪婪模式下匹配的结果为:hello1231321233123131
而修改为懒惰匹配$pattern = ‘/hello.+12/U’;
$subject = ‘hello1231321233123131’;
那么结果就会变为:hello12
三、常见正则表达式练习
- 非空:
/.+/
- 浮点数匹配:
/\d+.\d{2}$/
,实现保留两位的浮点数,$符号是上文中的边界控制哦~ - 手机号匹配:
/1[34578]\d{9}/
,匹配到的为1开头,第二位为3,4,5,7,或8的11位手机号 - email地址匹配:
/^\w+(.\w+)*@\w+(.\w+)+$/
(\w 字母,数字,下划线) - URL匹配:http是否出现,是http还是https。即
^(https?://)?
。是否是二级域名? 即:(\w+.)+
。顶级域名。即:[a-zA-Z]+
。故:正则表达式:^(https?://)?(\w+.)+[a-zA-Z]+$
3.1 正则工具类的设计实现
|
|
四、其他语言或ide工具的正则语法使用
4.1 vim下正则使用
vim下的正则使用主要是批量替换的功能,使用语法如::[range]s/from/to/[flags]
vim替换语法
range:搜索范围,如果没有指定范围,则作用于但前行。
- :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
- :10s/from/to/ 表示只在第10行搜索替换;
- :%s/from/to/ 表示在所有行中搜索替换;
- 1,$s/from/to/ 同上。
flags 有如下四个选项:
c
confirm,每次替换前询问;e
error, 不显示错误;g
globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;i
ignore,忽略大小写。
vim中使用的正则表达式语法
这里只针对vim中特殊的正则进行说明,其他的与通用正则大体一致。
- 元字符: 大体一致,比如
\w
代表匹配单词字母,等同于[0-9A-Za-z_] - 一些普通字符需转意
.
: 匹配.
字符, 不需要转义\
: 匹配\
字符, 不需要转义
- 表示位置的元字符
\<
: 匹配单词词首\>
: 匹配单词词尾
vim 使用范例
%s/^\(.\+\)$/,(\1)/
: 缓存变量使用,在vim中用\num
表示;:%s/\n//g
: 批量删除换行- 删除行尾空格:
:%s/\s+$//g
- 删除行首多余空格:
%s/^\s*//
或者%s/^ *//
- 删除沒有內容的空行:
%s/^$//
或者g/^$/d
- 删除包含有空格组成的空行:
%s/^\s*$//
或者g/^\s*$/d
- 删除以空格或TAB开头到结尾的空行:
%s/^[ |\t]*$//
或者g/^[ |\t]*$/d
- 把文中的所有字符串“
abc……xyz
”替换为“xyz……abc
”可以有下列写法:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
一些学习工具
- regexpal工具: 正则表达式书写辅助工具 regexpal 是Google Code上的一个开源项目,可以实时匹配正则表达式,方便调试,使用HTML和JS开发,推荐给大家使用。
- 鬼斧神工的正则表达式(PHP语言)