零全零美(www.zzgwt.com)
生活中的很多事情,并不像If...Else那么简单!
posts - 96,comments - 52,trackbacks - 0


贪婪量词:

先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么    再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。

 惰性量词:

先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。

支配量词:
只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。

贪婪量词   惰性量词    支配量词                      描述
-------------------------------------------------------------------------------------
  ?             ??             ?+                      可以出现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        var regexp = /.*bbb/g;
2        var a = str.match(regexp);
3        alert(a.length);   //output:1
4        alert(a[0]);       //output:abbbaabbbaaabbb

贪婪量词的工作过程可以这样表示:
  a)abbbaabbbaaabbb1234
  b)abbbaabbbaaabbb123
  c)abbbaabbbaaabbb12
  d)abbbaabbbaaabbb1
  e)abbbaabbbaaabbb //true
  可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)
2、惰性量词

1        var regexp = /.*?bbb/g;
2        var a = str.match(regexp);
3        alert(a.length);   //output:3
4        alert(a[0]);       //output:abbb
5        alert(a[1]);       //output:aabbb
6        alert(a[2]);       //output:aaabbb

惰性量词的工作过程可以这样表示:
  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        String string = "abbbaabbbaaabbb1234";
2        Pattern p = Pattern.compile(".*+bbb");
3        Matcher m = p.matcher(string);
4        System.out.println(m.find());   //output:false
5

因为支配量词采用一刀切的匹配方式,如:
  a)abbbaabbbaaabbb1234 //false
posted on 2009-01-07 14:54 零全零美 阅读(3454) 评论(3)  编辑  收藏 所属分类: 正则表达式

FeedBack:
# re: 正则表达式学习笔记(4) 贪婪、惰性和支配量词
2009-01-08 09:25 | 于翔
好强啊  回复  更多评论
  
# re: 正则表达式学习笔记(4) 贪婪、惰性和支配量词
2009-01-09 13:53 | 刘凯毅
上次提了下懒散匹配。没想到 blog主 这写的这麽详细,学习了。
贪婪、惰性和支配量词 说的这麽清楚真太清楚了。
为了表示与blog共同学习 正则,我就写点和本文擦边的,抛砖引玉把:
目的:
  使用 javascript a[0];
       java ma.group(0); 来取得你想要的值
  一正则一匹配,后面不需要多余动作。
内容》abbbaabbbaaabbb1234
$1预查 或 非消费-匹配
比如上面适用 .*bbb 》a[1]
   alert(a.length); //output:3
   alert(a[0]); //output:abbb
   alert(a[1]); //output:aabbb
   alert(a[2]); //output:aaabbb
正则》 aa.*?(?=aaa)
原则上》 必须要知道要匹配后文字
适用》 javascript/java
结果》 a[0] //output:aabbb

$2 非消费-匹配
  正则》(?<=b{3}).*(?=a{3})
  适用》java
  结果》ma.group(0) = aabbb
  原则》只要知道需要匹配的前后文字,不需要知道自己怎么样。


不太爽的地方:非消费-后匹配,javascript 没有
  就是 (?<=b{3}).*(?=a{3}) 的这个。







  回复  更多评论
  
# re: 正则表达式学习笔记(4) 贪婪、惰性和支配量词[未登录]
2010-08-08 15:46 | ty
搜来搜去都是这篇文章,抄袭成风啊。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: