下面深刻讲解下这几个元字符的意义:ide
(一) {0,1}
、{0,}
、{1,}
、{3}
逗号前面次数到逗号后面次数
上面列了几种都是{}
用于表示次数时常见的写法。
1. {0,1}
匹配0次或1次
2. {0,}
匹配0次以上,逗号后面为空表示无限次的意思
3. {1,}
匹配1次以上
4. {3}
匹配3次,它是{3,3}
的简写形式code
须要注意的是,前面数字大于后面数字是会报错的regexp
有时候会看到[0-9]{1}
这样的写法,其实这样写也算是多余的,它等价[0-9]
,正则里没有添加量词修饰的匹配都是按1次算。rpc
(二) ?
、??
0次或1次
?
匹配0次或1次,能够理解为{0,1}
的简写,常见用法有:
1. https?
用于匹配http
或https
2. (https?://)?
用于匹配域名前缀https?://
无关紧要的状况。
另外,须要了解的是,?
是匹配优先的,这是什么意思呢?
所谓匹配优先,就是字面意思,能匹配我就先匹配。
下面举例说明一下:
源码:www.zjmainstay.cn
正则:^(www\.)?(.+)$
匹配结果是:分组1获得了www.
,分组2获得了zjmainstay.cn
从这里能够看出,对于(www\.)?
部分的正则,它先进行了匹配,而后.+
部分再匹配。
那么,若是咱们想要把www.
留给后面的.+
去匹配怎么办?
咱们须要找到一个非匹配优先的方法,对于非匹配优先,接触过非贪婪模式的读者可能立刻想到非贪婪模式,不错,利用非贪婪模式能够解决这个问题:
正则:^(www\.)*?(.+)$
固然,使用正则:^(www\.){0,1}?(.+)$
也是能够的,并且这个更接近本来的意思。
另外,不少人可能没见过,其实咱们还能用:^(www\.)??(.+)$
实现。这里的??
是?
的非匹配优先版本。get
(三) *
0次以上,即0~n
*
0次或任意次,能够理解为{0,}
的简写,常见用法有:
1. .*
贪婪模式,匹配优先,匹配除换行外的任意字符0次以上
2. .*?
非贪婪模式,非匹配优先,匹配除换行外的任意字符0次以上
3. <a href="/[^"]*"
在href="/"
的双引号中间,匹配非"
的字符0次以上源码
你们可能发现,.*?
这里也有?
,可是它已经脱离了前面对?
介绍的0次或1次的范围,没错,只是为了让你们不至于混淆,我没有把它纳入上面的?
当中。
咱们能够理解为,?
只要跟本文所说的几个计次量词结合,就造成非贪婪模式。甚至,连??
你均可以认为是结合后的0次或1次的非贪婪模式,反正也能解释通不是?qt
(四) +
1次以上,即1~n
+
与 *
除了匹配次数意义上有所差异,常见用法都相似,它强调的是至少匹配1次以上,能够理解为{1,}
的简写。
1. .+
贪婪模式,匹配优先,匹配除换行外的任意字符1次以上
2. .+?
非贪婪模式,非匹配优先,匹配除换行外的任意字符1次以上
3. <a href="/[^"]+"
在href="/"
的双引号中间,匹配非"
的字符1次以上域名
总结
量词自己使用时,都是贪婪模式匹配,而量词和?
能结合成非贪婪模式匹配。
贪婪模式匹配就是尽量多地匹配,非贪婪模式匹配就是尽量少地匹配。it