Ordinary hut

人间一福地,胜似天仙宫
posts - 61, comments - 50, trackbacks - 0, articles - 1

正则表达式中的贪婪、惰性和支配量词

Posted on 2009-10-30 16:13 landor 阅读(448) 评论(0)  编辑  收藏 所属分类: 正则
正则表达式中有三个量词:贪婪、惰性、支配,记录一下我对贪婪和惰性的理解
1 贪婪:一下子打算匹配整个字符串,如果发现不匹配,就去掉最后一个字符,进行匹配,以此类推。一旦匹配成功之后,并不是马上返回,而是跳跃到下一个字符的起点,再次开始贪婪的匹配,举个例子:
    public static void main(String []args) {
        String str
="1abbbaabbbaaabbb1234abbbc"
        Pattern p2 
= Pattern.compile("[^1]*bbb");
        Matcher m2 
=p2.matcher(str);
        
while(m2.find()){
            System.out.println(m2.group());
        }
    }
他的执行过程应该是这样:
  先找到满足条件的第一个字符,所以1会被过滤掉,然后进行全局匹配
  abbbaabbbaaabbb1234abbbc  不匹配
  abbbaabbbaaabbb1234abbb   不匹配
  abbbaabbbaaabbb1234abb    不匹配
  

  abbbaabbbaaabbb          匹配
  之后表达式会继续寻找这个字符串后面的匹配的第一个字符,所以后面的1会被过滤掉,然后再进行全局匹配,即:
  234abbbc   不匹配
  234abbb    匹配
所以会得到两个匹配结果  abbbaabbbaaabbb和234abbb

2 惰性
从第一个字符开始进行匹配,如果不匹配,那么就在读入一个字符,进行整体匹配,以此类推

还是看上面的例子,如果是贪婪的,那么正则是这样
[^1]*?bbb,执行过程如下:
  先找到满足条件的第一个字符,所以1还是被过滤,从a开始,匹配过程如下
  a    不匹配
  ab   不匹配
  abb  不匹配
  abbb 匹配

  继续从下一个位置开始读入第一个匹配字符
  a    不匹配
  aa   不匹配
  
不匹配
  aabbb匹配

 一直进行到最后,所以得到的结果为abbb,aabbb,aaabbb,234abbb

3 支配
  支配就是对整个字符串进行一次匹配,匹配之后返回
  举个例子,字符串为bbb,正则表达式为[b]*+,这是一个贪婪的匹配,直接返回bbb
  但是这里有个要注意的地方:如果正则为
[b]*+b,返回结果是false,是空

所以虽然
[b]*+匹配了,但是当再多了一个b的时候,有不满足要求了,因为他们是全局匹配的

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


网站导航: