正则表达式匹配次-贪婪匹配
{n} 表达式固定重复n次,比如:"/w{2}" 相当于 "/w/w"。
{m, n} 表达式尽可能重复 n 次,至少重复 m 次:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"。
{m, } 表达式尽可能的多匹配,至少重复 m 次:"/w/d{2,}"可以匹配 "a12","x456"...。
? 表达式尽可能匹配 1 次,也可以不匹配,相当于 {0, 1}。
+ 表达式尽可能的多匹配,至少匹配 1 次,相当于 {1, }。
* 表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }。
示例
abbbbb
正则表达式 b{2,3} 匹配出两个结果:bbb 、bb 。
正则表达式匹配次-懒惰匹配
懒惰匹配又称非贪婪匹配、勉强匹配。
{m, n}? 表达式尽量只匹配 m 次,最多重复 n 次。
{m, }? 表达式尽量只匹配 m 次,最多可以匹配任意次。
?? 表达式尽量不匹配,最多匹配 1 次,相当于 {0, 1}?。
+? 表达式尽量只匹配 1 次,最多可匹配任意次,相当于 {1, }?。
*? 表达式尽量不匹配,最多可匹配任意次,相当于 {0, }?。
示例
abbbbb
正则表达式 b{2,3}? 匹配出两个结果:bb 、bb 。
正则表达式匹配次-占有模式
占有模式在某些特定的语言(比如 JAVA)中才有效,并且很少用,所以不必投入太多的关注。
{m, n}+ 表达式尽可能重复 n 次,至少重复 m 次。
{m, }+ 表达式尽可能的多匹配,至少重复 m 次。
?+ 表达式尽可能匹配 1 次,也可以不匹配,相当于 {0, 1}+。
++ 表达式尽可能的多匹配,至少匹配 1 次,相当于 {1, }+。
*+ 表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }+。
可以看出占有模式似乎和贪婪模式很相像,但还是有区别的:
用正则表达式匹配字符串的时候会产生很多中间状态,(一般的匹配引擎会保存这种中间状态,)这样匹配失败的时候就能原路返回了。占有型的表达式不保存这种中间状态,因此也就不会回头重来了。它能防止正则表达式的失控,同时也能提高运行的效率。