正则表达式

2017年04月11日 shenbowei

正则表达式

原子\元字符 含义描述
^或\A 匹配输入字符串的开始位置(或在多行模式\n\r之后的位置)
$或\Z 匹配输入字符串的结束位置(或在多行模式\n\r之前的位置)
\ 转义字符或一个向后引用
* 匹配0次、1次或多次其前的原子。例如,zo*能匹配z以及zoo。*等价于{0,}
+ 匹配1次或多次其前的原子。例如,zo+能匹配zo以及zoo,但不能匹配z。+等价于{1,}
? 匹配0次或1次其前的原子。例如,do(es)?可以匹配doesdo。?等价于{0,1}
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串ooooo+?将匹配单个o,而o+将匹配oooo
. 匹配除了换行符\n外的任意一个字符
x|y 匹配两个或多个分支选择,即匹配x或者匹配y
{n} 表示其前的原子恰好出现n次
{n,} 表示其前的原子出现不少于n次
{n,m} 表示其前的原子出现n到m次
[xyz] 匹配方括号中指定的任意一个原子,即匹配xyz
[^xyz] 匹配除方括号中的原子以外的任意一个字符,即匹配除了xyz外的任意字符
[a-z] 匹配az范围内的任意小写字母字符
[^a-z] 匹配az范围外的任意字符
() 匹配其整体为一个原子,即模式单元,并获取这一匹配,可以通过\进行引用。
(?: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-Za-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,个别表达式可能存在问题,用前请谨慎验证:

Common Regular Expression

常用正则表达式大全汇总

CommonRegexJS

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函数

参考文献

正则表达式 ?:,?=,?!

正则表达式零宽断言详解

Common Regular Expression

常用正则表达式大全汇总

正则表达式之道

PCRE 函数

《细说PHP》第九章 正则表达式


评论