正则表达式的贪婪匹配和非贪婪匹配
A.*c
toAbcAbcA
matchesAbcAbc
rather than the shorterAbc
. To do nongreedy matching, a question mark must be added to the quantifier. For example, the patternA.*?c
will find the shortest match possible.关于?=
http://topic.csdn.net/u/20100902/16/9a8f2249-86f2-4f80-b5f5-dbf8769ba674.html
贪婪量词:
![]() |
惰性量词:
![]() |
支配量词:
![]() |
贪婪量词 惰性量词 支配量词 描述
-------------------------------------------------------------------------------------
? ?? ?+ 可以出现0次或1次,但至多出现1次
* *? *+ 可以出现任意次,也可以不出现
+ +? ++ 出现1次或多次,但至少出现1次
{n} {n}? {n}+ 一定出现n次
{n,m} {n,m}? {n,m}+ 至少出现n次,但至多不能超过m次
{n,} {n,}? {n,}+ 可以出现任意次,但至少出现n次
例如:我们要从字符串abbbaabbbaaabbb1234中获得abbb,aabbb,aaabbb的匹配
1、贪婪量词
1![]() 2 ![]() 3 ![]() 4 ![]() |
贪婪量词的工作过程可以这样表示:
a)abbbaabbbaaabbb1234
b)abbbaabbbaaabbb123
c)abbbaabbbaaabbb12
d)abbbaabbbaaabbb1
e)abbbaabbbaaabbb //true
可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)
2、惰性量词
1![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() |
惰性量词的工作过程可以这样表示:
a)a
b)ab
c)abb
d)abbb //保存结果,并从下一个位置重新开始
e)a
f)aa
g)aab
h)aabb
j)aabbb //保存结果,并从下一个位置重新开始
e)a
e)aa
e)aaa
e)aaab
e)aaabb
e)aaabbb //保存结果,并从下一个位置重新开始
由于JS是不支持支配量词的,所以支配量词我们只能用JAVA来演示:
1![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() |
因为支配量词采用一刀切的匹配方式,如:
a)abbbaabbbaaabbb1234 //false
http://java.chinaitlab.com/base/773980.html