正则

认识正则

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

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

常用字符簇

代表
.(点)
任意字符,不含换行
\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

 

* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
\? 匹配前面的子表达式零次或一次。
{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 = '/\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)

 

模式

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

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

php下正则匹配中文

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

 

 

预查

 

 

 

 

 

 

 

 

 

 

posted @ 2020-02-06 00:01  DSKer  阅读(136)  评论(0编辑  收藏  举报