2016年08月09日 00:00:00

正则表达式匹配次数

作者: 

正则表达式里匹配次数的元字符有:
(一) {0,1}{0,}{1,}{3} 逗号前面次数到逗号后面次数
(二) ??? 0次或1次
(三) * 0次以上,即0~n
(四) + 1次以上,即1~n

下面深入讲解下这几个元字符的意义:

(一) {0,1}{0,}{1,}{3} 逗号前面次数到逗号后面次数

上面列了几种都是{}用于表示次数时常见的写法。
1. {0,1} 匹配0次或1次
2. {0,} 匹配0次以上,逗号后面为空表示无限次的意思
3. {1,} 匹配1次以上
4. {3} 匹配3次,它是{3,3}的简写形式

需要注意的是,前面数字大于后面数字是会报错的

有时候会看到[0-9]{1}这样的写法,其实这样写也算是多余的,它等价[0-9],正则里没有添加量词修饰的匹配都是按1次算。

(二) ??? 0次或1次

? 匹配0次或1次,可以理解为{0,1}的简写,常见用法有:
1. https? 用于匹配httphttps
2. (https?://)? 用于匹配域名前缀https?://可有可无的情况。
另外,需要了解的是,?是匹配优先的,这是什么意思呢?
所谓匹配优先,就是字面意思,能匹配我就先匹配
下面举例说明一下:
源码:www.zjmainstay.cn
正则:^(www\.)?(.+)$
匹配结果是:分组1得到了www.,分组2得到了zjmainstay.cn
从这里可以看出,对于(www\.)?部分的正则,它先进行了匹配,然后.+部分再匹配。
那么,如果我们想要把www.留给后面的.+去匹配怎么办?
我们需要找到一个非匹配优先的方法,对于非匹配优先,接触过非贪婪模式的读者可能马上想到非贪婪模式,不错,利用非贪婪模式可以解决这个问题:
正则:^(www\.)*?(.+)$
当然,使用正则:^(www\.){0,1}?(.+)$也是可以的,而且这个更接近原本的意思。
另外,很多人可能没见过,其实我们还能用:^(www\.)??(.+)$实现。这里的???的非匹配优先版本。

(三) * 0次以上,即0~n

* 0次或任意次,可以理解为{0,}的简写,常见用法有:
1. .* 贪婪模式,匹配优先,匹配除换行外的任意字符0次以上
2. .*? 非贪婪模式,非匹配优先,匹配除换行外的任意字符0次以上
3. <a href="/[^"]*"href="/"的双引号中间,匹配非"的字符0次以上

大家可能发现,.*? 这里也有?,但是它已经脱离了前面对?介绍的0次或1次的范围,没错,只是为了让大家不至于混淆,我没有把它归入上面的?当中。
我们可以理解为,?只要跟本文所说的几个计次量词结合,就形成非贪婪模式。甚至,连??你都可以认为是结合后的0次或1次的非贪婪模式,反正也能解释通不是?

(四) + 1次以上,即1~n

+* 除了匹配次数意义上有所差别,常见用法都类似,它强调的是至少匹配1次以上,可以理解为{1,}的简写。
1. .+ 贪婪模式,匹配优先,匹配除换行外的任意字符1次以上
2. .+? 非贪婪模式,非匹配优先,匹配除换行外的任意字符1次以上
3. <a href="/[^"]+"href="/"的双引号中间,匹配非"的字符1次以上

总结

量词本身使用时,都是贪婪模式匹配,而量词和?能结合成非贪婪模式匹配。
贪婪模式匹配就是尽可能多地匹配,非贪婪模式匹配就是尽可能少地匹配。




文末,感谢@╰⋛⋋⊱⋋神猫鹰⋌⊰⋌⋚╯ 对本文结构调整的建议。

更多关于正则表达式入门的内容,请参考本站博客《我眼里的正则表达式入门教程
更多关于正则表达式高级的内容,请参考本站博客《深入讲解正则表达式高级教程
Windows正则表达式测试工具请从《正则表达式测试工具RegexBuddy-4.1.0》下载
Mac正则表达式测试工具请从《Mac正则表达式测试工具》下载



未经同意禁止转载!
转载请附带本文原文地址:正则表达式匹配次数,首发自 Zjmainstay学习笔记
阅读( 1602 )
看完顺手点个赞呗:
(4 votes)

1.PHP cURL群:PHP cURL高级技术
2.正则表达式群:专精正则表达式
3. QQ联系(加请说明):QQ联系博主(951086941)
4. 邮箱:zjmainstay@163.com
5. 打赏博主: 捐赠支持本博客

阿里云幸运券分享
网站总访问量: