关于正则表达式中.?,..?,.+?,.*的表达区别

关于正则

刚开始学习正则,从量词开始,也算是自我总结吧。

案例就以HTML的H<1-6>标签为例子

H1
H2__
H3___
H4____
H5_____
H6______
(注:标签后面的空格不明显,所有用下划线代替了,如H2后面是两个下划线,以此类推。)

正则规则举例:

正则式:H<1-6>
$str = '';
$isMatched = preg_match('/H[1-6]./', $str, $matches);
var_dump($isMatched, $matches);

匹配结果为:

H1
H2
H3
H4
H5
H6

理解:匹配H1-H6即可

正则式:H<1-6>.?

匹配结果为:

H1
H2_
H3_
H4_
H5_
H6_

理解:匹配H1-H6,并且看后面是否有字符。如果有,那就只匹配一个,如果没有,也可以匹配。

.?:0-1的解释。没有也行,如果有,即便后面有100个也只匹配一个!

正则式:H<1-6>+?

匹配结果为:

H1
H2
H3
H4
H5
H6

理解:匹配H1-H6,并且不看阿拉伯数字后面是否有字符。

+?:最少要匹配一个昂,铁子。

正则式:H<1-6>…?

匹配结果为:

H2__
H3__
H4__
H5__
H6__

理解:匹配H1-H6,并且必须还要带一个"_",然后接着往后看,有就只匹配一个,没有也给匹配出来。

…?:这个要分开看,实际上是H<1-6>.+ .?

正则式:H<1-6>.+?

匹配结果为:

H2_
H3_
H4_
H5_
H6_

理解:匹配H1-H6,并且必须只能带一个"_",如果能实现,则匹配成功。

.+?:这个要分开看,实际上是H<1-6>.+ +?

正则式:H<1-6>.*

匹配结果为:

H1
H2__
H3___
H4____
H5_____
H6______

理解:匹配H1-H6,并且看后面是否有字符。甭管有没有,有多少,全都给我匹配上。

.*:不管H<1-6>的后面有多少东西,我全都要!

正则式:H<1-6>.*?

匹配结果为:

H1
H2
H3
H4
H5
H6

通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。
那么就是看,H<1-6>.*是匹配的H1-H6______(无论阿拉伯数字后面有啥,都匹配出来),但是在H<1-6>.*后面加了一个"?"之后就变成了H<1-6>.*?,即非贪婪模式,只要符合最小匹配的表达式就可以了,那这里最小匹配表达式就是H1。

我觉得吧,看到. 就是要往后看;看到+就是要往前看。
再者,回看上边的例子,如何理解.*和.+号呢,我觉得哈,.*就是0-无穷(可以匹配H1-H6后面有没有字符都无所谓,我全都要),.+就是1-无穷(只匹配H1-H6后面最少有一个字符是基础。)
.和+多也不要慌,先看准基础匹配式才是最重要的。
比如:H<1-6>…?和H<1-6>…?的区别,以及H<1-6>.+?和H<1-6>…+?的区别。

实在写不出官方的解释词,所以只能按照自己理解的写了,各位小伙伴轻喷。

你可能感兴趣的:(正则)