正则表达式
原子\元字符 | 含义描述 |
---|---|
^或\A |
匹配输入字符串的开始位置(或在多行模式\n 、\r 之后的位置) |
$或\Z |
匹配输入字符串的结束位置(或在多行模式\n 、\r 之前的位置) |
\ |
转义字符或一个向后引用 |
* |
匹配0次、1次或多次其前的原子。例如,zo* 能匹配z 以及zoo 。*等价于{0,} |
+ |
匹配1次或多次其前的原子。例如,zo+ 能匹配zo 以及zoo ,但不能匹配z 。+等价于{1,} |
? |
匹配0次或1次其前的原子。例如,do(es)? 可以匹配does 或do 。?等价于{0,1} |
? |
当该字符紧跟在任何一个其他限制符(* ,+ ,? ,{n} ,{n,} ,{n,m} )后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串oooo ,o+? 将匹配单个o ,而o+ 将匹配oooo |
. |
匹配除了换行符\n 外的任意一个字符 |
x|y |
匹配两个或多个分支选择,即匹配x或者匹配y |
{n} |
表示其前的原子恰好出现n次 |
{n,} |
表示其前的原子出现不少于n次 |
{n,m} |
表示其前的原子出现n到m次 |
[xyz] |
匹配方括号中指定的任意一个原子,即匹配x 、y 或z |
[^xyz] |
匹配除方括号中的原子以外的任意一个字符,即匹配除了x 、y 和z 外的任意字符 |
[a-z] |
匹配a 到z 范围内的任意小写字母字符 |
[^a-z] |
匹配a 到z 范围外的任意字符 |
() |
匹配其整体为一个原子,即模式单元,并获取这一匹配,可以通过\ 进行引用。 |
(?:pattern) |
匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符(|) 来组合一个模式的各个部分是很有用。例如industr(?:y|ies) 就是一个比industry|industries 更简略的表达式 |
(?=pattern) |
正向肯定预查,在任何匹配pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,Windows(?=95|98|NT|2000) 能匹配Windows2000 中的Windows ,但不能匹配Windows3.1 中的Windows 。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?!pattern) |
正向否定预查,在任何不匹配pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如Windows(?!95|98|NT|2000) 能匹配Windows3.1 中的Windows ,但不能匹配Windows2000 中的Windows 。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<=pattern) |
反向肯定预查,与正向肯定预查类似,只是方向相反。例如,(?<=95|98|NT|2000)Windows 能匹配2000Windows 中的Windows ,但不能匹配3.1Windows 中的Windows |
(?<!pattern) |
反向否定预查,与正向否定预查类似,只是方向相反。例如(?<!95|98|NT|2000)Windows 能匹配3.1Windows 中的Windows ,但不能匹配2000Windows 中的Windows |
\b |
匹配一个单词边界,也就是指单词和空格间的位置。例如,er\b 可以匹配never 中的er ,但不能匹配verb 中的er |
\B |
匹配非单词边界。例如,er\B 能匹配verb 中的er ,但不能匹配never 中的er |
\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_] |
\cx |
匹配由x 指明的控制字符。例如,\cM 匹配一个Control-M 或回车符 。x 的值必须为A-Z 或a-z 之一。否则,将c 视为一个原义的c 字符 |
\f |
匹配一个换页符,等价于\x0c 和\cL |
\n |
匹配一个换行符,等价于\x0a 和\cJ |
\r |
匹配一个回车符,等价于\x0d 和\cM |
\t |
匹配一个制表符,等价于\x09 和\cI |
\v |
匹配一个垂直制表符,等价于\x0b 和\cK |
模式修正符 | 功能描述 |
---|---|
i |
模式中的字母会进行大小写不敏感匹配 |
m |
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), “行首”元字符 (^ ) 仅匹配字符串的开始位置, 而”行末”元字符 ($ ) 仅匹配字符串末尾, 或者最后的换行符(除非设置了D 修饰符)。这个行为和perl 相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于perl 的/m 修饰符。如果目标字符串中没有\n 字符,或者模式中没有出现^ 或$ ,设置这个修饰符不产生任何影响 |
s |
如果设置了这个修饰符,模式中的点号元字符. 匹配所有字符,包含换行符。即将字符串视为单行,换行符作为普通字符看待。如果没有这个修饰符,点号不匹配换行符。这个修饰符等同于perl 中的/s 修饰符。 一个取反字符类比如[^a] 总是匹配换行符,而不依赖于这个修饰符的设置 |
x |
模式中的空白忽略不计,除非它已经被转义 |
e |
Warning:This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0. 所以不要轻易使用了,作用是:只用在preg_replace() 函数中,在替换的字符串中对逆向引用做正常的替换,将其作为PHP 代码求值,并用其结果替换所搜索的字符串 |
U |
这个修饰符逆转了量词的”贪婪”模式。使量词默认为非贪婪的,通过量词后紧跟? 的方式可以使其成为贪婪的。这和perl 是不兼容的。 |
D |
如果这个修饰符被设置,模式中的元字符美元符号$ 仅仅匹配目标字符串的末尾。如果这个修饰符没有设置,当字符串以一个换行符结尾时,美元符号$ 还会匹配该换行符(但不会匹配之前的任何换行符)。 如果设置了修饰符m ,这个修饰符被忽略。在perl 中没有与此修饰符等同的修饰符 |
其他的模式修正符号请参考: PHP手册-模式修饰符
常用正则表达式
可以参考下面的链接,是我搜索github
上常用正则表达式汇总的repo
,个别表达式可能存在问题,用前请谨慎验证:
PHP
相关函数
在PHP
中支持两套正则表达式处理函数库:
-
PCRE
(Perl Compatible Regular Expression),与Perl
语言兼容的正则表达式函数。以preg_
为前缀命名的函数,而且表达式都应该被包含在定界符中,如斜线/
。 -
POSIX
(Portable Operation System Interface of UNIX)拓展语法的正则表达式函数。以ereg_
为前缀命名的函数。与PCRE
功能类似,但是执行效率不如PCRE
。
函数名 | 功能描述 |
---|---|
preg_match |
进行正则表达式匹配,返回0或1表示不匹配或匹配(匹配1次就停止搜索) |
preg_match_all |
进行全局正则表达式匹配,返回匹配次数 |
preg_replace |
执行正则表达式的搜索和替换 |
preg_split |
用正则表达式分割字符串 |
preg_grep |
返回与模式匹配的数组单元 |
preg_replace_callback |
用回调函数执行正则表达式的搜索和替换 |
更多请参考:PHP手册- PCRE函数
参考文献
《细说PHP》第九章 正则表达式