正则
认识正则
正则其实就是字符串规则表达式
常用字符簇
簇 | 代表 |
.(点)
|
任意字符,不含换行
|
\w
|
[a-z A-Z 0-9_ ]
|
\W
|
\w 的补集
|
\s
|
空白符,包括 \n\r\t\v 等
|
\S
|
非空白符
|
\d
|
[0-9]
|
\D
|
非数字
|
“\b”匹配单词边界,不匹配任何字符。
“\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。
基本上所有的资料里都会说“\b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“\w”所定义的字符所组成的子串。
“\b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置
\b匹配不全是\w的单词边界。意思就是一定是一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。
零宽与非零宽
非零宽字符:能够匹配字符的(特殊)字符。如:\d会匹配一个数字,\s会匹配空白字符
零宽字符:不匹配字符,只标记位置如 ^ $ \b \B
// 5个字母组成的单词 $patt = '/[a-zA-Z]{5}/'; // 3-5个字母组成的单词 $patt = '/[a-zA-Z]{3,5}/'; // 5个以上字母组成的单词 $patt = '/[a-zA-Z]{5,}/';
//查询纯数字或纯字母的单词
$patt = '/\b[a-zA-Z]+\b|\b[0-9]+\b/';
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。
分组和向后引用
圆括号匹配(捕获分组)
(1).圆括号内包含的表达式语义与没有加圆括号时一致,区别在于圆括号内的内容将会加入到捕获分组,捕获分组的概念
(2).圆括号也可以和限定符搭配使用,限定圆括号内的匹配语义出现次数
捕获分组的概念
先看下面两个例子:
假如有字符串 3cd
则 “(\d)cd ”匹配结果为 3cd 和 3
假如有字符串 6cd
则 (3|6)cd 匹配结果为 6cd 和 6
括号里面的匹配则为捕获匹配,且括号里面的匹配结果将会被缓存 ,第一个例子括号里的括号匹配的结果为3,第二个括号里匹配结果为6
如果想消除缓存,可以在括号最前面加上 ?:
则
1中 (?:\d)cd 匹配结果为 3cd ,等价于 [\d]cd 或 \dcd
2中 (?:3|6)cd 匹配结果为 6cd,等价于 [36]cd
后向引用:
捕获分组可以进行 后向引用 (如果正则表达式后面有相同的捕获分组内容,可以根据顺序直接引用前面定义的捕获组,简化表达式)
如
(\d)cd\1 这里的"\1"就是对"(\d)"的后向引用 ,等同于(\d)cd\(\d)
(a)(b)(ac).* \1\2\3
等价于
(a)(b)(ac).* (a)(b)(ac)
模式
u模式,把传入的参数看成是Unicode字符集的编码,可以判断中文
php下正则匹配中文
$patt = '/^[\x{4e00}-\x{9fa5}]+$/u';