正则应该是我们在写 PHP 和 JS 时,应该是经常要用到的一个方法了。然而正则太过强大,语法及规则不易掌握,需要经常查找翻阅资料。在此,下面的表格中列举了构成正则表达式的一些语法规则及其含义,以供查阅参考。
1 字符
语法 | 说明 | 表达式示例 | 匹配结果 |
---|---|---|---|
一般字符 | 匹配自身 | abc | abc |
. | 匹配任意除换行符"\n"外的字符, 在 DOTALL 模式中也能匹配换行符 | a.c | abc |
\ | 转义字符,使后一个字符改变原来的意思; 如果字符串中有字符 * 需要匹配,可以使用 \* 或者字符集[*]。 | a\.c a\\c | a.c a\c |
[...] | 字符集(字符类),对应的位置可以是字符集中任意字符。 字符集中的字符可以逐个列出,也可以给出范围,如 [abc] 或 [a-c], 第一个字符如果是 ^ 则表示取反,如 [^abc] 表示除了 abc 之外的其他字符。 | a[bcd]e | abe 或 ace 或 ade |
\d | 数字:[0-9] | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\Sc | abc |
\w | 单词字符:[A-Za-z0-9] | a\wc | abc |
\W | 非单词字符:[^\w] | a\Wc | a c |
2 数量词(用在字符或 (...) 之后)
语法 | 说明 | 表达式示例 | 匹配结果 |
---|---|---|---|
* | 匹配前一个字符 0 或无限次 | abc* | ab 或 abccc |
+ | 匹配前一个字符 1 次或无限次 | abc+ | abc 或 abccc |
? | 匹配前一个字符 0 次或 1 次 | abc? | ab 或 abc |
{m} | 匹配前一个字符 m 次 | ab{2}c | abbc |
{m,n} | 匹配前一个字符 m 至 n 次,m 和 n 可以省略,若省略 m,则匹配 0 至 n 次; 若省略 n,则匹配 m 至无限次 | ab{1,2}c | abc 或 abbc |
3 边界匹配
语法 | 说明 | 表达式示例 | 匹配结果 | ^ | 匹配字符串开头,在多行模式中匹配每一行的开头 | ^abc | abc |
---|---|---|---|
$ | 匹配字符串末尾,在多行模式中匹配每一行的末尾 | abc$ | abc |
\A | 仅匹配字符串开头 | \Aabc | abc |
\Z | 仅匹配字符串末尾 | abc\Z | abc |
\b | 匹配 \w 和 \W 之间 | a\b!bc | a!bc |
\B | [^\b] | a\Bbc | abc |
4 逻辑、分组
语法 | 说明 | 表达式示例 | 匹配结果 |
---|---|---|---|
| | | 代表左右表达式任意匹配一个,优先匹配左边的表达式 | abc|def | abc 或 def |
(...) | 括起来的表达式将作为分组,分组将作为一个整体,可以后接数量词 | (abc){2} | abcabc |
(?P<name>...) | 分组,功能与 (...) 相同,但会指定一个额外的别名 | (?P<id>abc){2} | abcabc |
\<number> | 引用编号为 <number> 的分组匹配到的字符串 | (\d)abc\1 | 1abe1 或 5abc5 |
(?P=name) | 引用别名为 <name> 的分组匹配到的字符串 | (?P<id>\d)abc(?P=id) | 1abe1 或 5abc5 |
5 特殊构造(不作为分组)
语法 | 说明 | 表达式示例 | 匹配结果 |
---|---|---|---|
(?:...) | (…) 的不分组版本,用于使用 "|" 或后接数量词 | (?:abc){2} | abcabc |
(?iLmsux) | iLmsux 中的每个字符代表一种匹配模式,只能用在正则表达式的开头,可选多个 | (?i)abc | AbC |
(?#...) | # 后的内容将作为注释被忽略。 | abc(?#comment)123 | abc123 |
(?=...) | 之后的字符串内容需要匹配表达式才能成功匹配 | a(?=\d) | 后面是数字的 a |
(?!...) | 之后的字符串内容需要不匹配表达式才能成功匹配 | a(?!\d) | 后面不是数字的 a |
(?<=...) | 之前的字符串内容需要匹配表达式才能成功匹配 | (?<=\d)a | 前面是数字的 a |
(?<!...) | 之前的字符串内容需要不匹配表达式才能成功匹配 | (?<!\d)a | 前面不是数字的 a |
6 模式修饰符
模式修饰符的作用是设定模式,也就是正则表达式如何解释。
i (PCRE_CASELESS)
如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。
m (PCRE_MULTILINE)
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。
s (PCRE_DOTALL)
如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s 修饰符。 一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。
x (PCRE_EXTENDED)
如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符 等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符 还是不能在模式的特殊字符序列中出现,比如序列 (?( 引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误。 比如(?(就会导致错误)。
A (PCRE_ANCHORED)
如果设置了这个修饰符,模式被强制为"锚定"模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且 这也是 perl 种实现这种模式的唯一途径。
D (PCRE_DOLLAR_ENDONLY)
如果这个修饰符被设置,模式中的元字符美元符号仅仅匹配目标字符串的末尾。如果这个修饰符 没有设置,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符)。 如果设置了修饰符 m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符。
S
当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间 对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。
U (PCRE_UNGREEDY)
这个修饰符逆转了量词的"贪婪"模式。 使量词默认为非贪婪的,通过量词后紧跟? 的方式可以使其成为贪婪的。这和 perl 是不兼容的。 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?)。
X (PCRE_EXTRA)
这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后就 ingen 一个 没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。 默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。 当前没有其他特性由这个修饰符控制。
J (PCRE_INFO_JCHANGED)
内部选项设置(?J)修改本地的 PCRE_DUPNAMES 选项。允许子组重名, (译注:只能通过内部选项设置,外部的 /J 设置会产生错误。) 自 PHP 7.2.0 起,也能支持 J 修饰符。
u (PCRE_UTF8)
此修正符打开一个与 Perl 不兼容的附加功能。 模式和目标字符串都被认为是 UTF-8 的。 无效的目标字符串会导致 preg_* 函数什么都匹配不到; 无效的模式字符串会导致 E_WARNING 级别的错误。 5 字节和 6 字节的 UTF-8 字符序列以无效字符序列对待。
7 相关参考
正则表达式 - 我没有领悟 - 博客园
php 正则怎么使用(最全最细致) - 范仁义 - 博客园
PHP: 正则表达式模式中可用的模式修饰符 - Manual
PHP 正则表达式后面接的/isU, /is, /s 含义 | 孟坤博客
还没有人赞赏,快来当第一个赞赏的人吧!
声明:本文为原创文章,版权归龙笑天下所有,欢迎分享本文,转载请保留出处!