正则

认识正则

正则其实就是字符串规则表达式

入手:找谁?怎么找?找几个?
 
具体字符 (字面值)
字符边界
字符集合[ace],[01235689]
字符补集[^ qxz ]:不在qxz 范围内
字符范围[a-z0-9]
字符簇(系统定义好的常用集合)
 
字符边界
- ^ 匹配字符串的开始
- $ 匹配字符串的结尾
-  匹配单词的开始和结尾(边界)
- B匹配单词的非边界
 

常用字符簇

代表
.(点)
任意字符,不含换行
w
[a-z A-Z 0-9_ ]
W
w 的补集
s
空白符,包括 v 等
S
非空白符
d
[0-9]
D
非数字

“”匹配单词边界,不匹配任何字符。 
“”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“”是零宽度的。 
基本上所有的资料里都会说“”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“w”所定义的字符所组成的子串。 
“”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置

匹配不全是w的单词边界。意思就是一定是一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。

零宽与非零宽

非零宽字符:能够匹配字符的(特殊)字符。如:d会匹配一个数字,s会匹配空白字符 
零宽字符:不匹配字符,只标记位置如 ^ $  B

* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的 n 次。
{n,m} m 和 n 均为非负整数,其中n <= m
最少匹配 n 次且最多匹配 m 次。。
{n,} n 是一个非负整数。至少匹配n 次。
 
eg:
// 5个字母组成的单词
$patt = '/[a-zA-Z]{5}/';
// 3-5个字母组成的单词
$patt = '/[a-zA-Z]{3,5}/';
// 5个以上字母组成的单词
$patt = '/[a-zA-Z]{5,}/';

  

或者的用法
 
//查询纯数字或纯字母的单词
$patt = '/[a-zA-Z]+|[0-9]+/';

  

贪婪与非贪婪

 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分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)cd1 这里的"1"就是对"(d)"的后向引用 ,等同于(d)cd(d)

(a)(b)(ac).* 123

等价于

(a)(b)(ac).* (a)(b)(ac)

模式

模式修饰符,可以一定程度上影响正则的解析行为
比如i, 就代表正则不区分大小写, /[a-z A-Z ]+/ --->/[a-z ]+/i
比如s, 单行模式, 就代表把整个文件看成一个"单行"

u模式,把传入的参数看成是Unicode字符集的编码,可以判断中文

php下正则匹配中文

$patt = '/^[x{4e00}-x{9fa5}]+$/u';

 

预查

 

原文地址:https://www.cnblogs.com/DSKer/p/12267391.html