技术控

    今日:59| 主题:49101
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Java正则表达中Greedy Reluctant Possessive 的区别

[复制链接]
深流Penetrasunny 发表于 2016-10-12 07:02:26
99 2

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
上一篇文章《 编程思想之正则表达式 》中讲了正则表达式的原理、使用方法和常见的正则表达式总结,本文将进一步探讨Java正则表达中Greedy、Reluctant、Possessive三种策略的区别。
  从Java的官方文档http://docs.Oracle.com/javase/7/docs/api/java/util/regex/Pattern.html中我们可以看到,正则表达式表示数量词的符号有三套,分别是Greedy(贪婪的)、Reluctant(勉强的)和Possessive(独占的)。其含意如下:
              Greedy 数量词             X?     X,一次或一次也没有             X*     X,零次或多次             X+     X,一次或多次             X{n}     X,恰好 n 次             X{n,}     X,至少 n 次             X{n,m}     X,至少 n 次,但是不超过 m 次                               Reluctant 数量词             X??     X,一次或一次也没有             X*?     X,零次或多次             X+?     X,一次或多次             X{n}?     X,恰好 n 次             X{n,}?     X,至少 n 次             X{n,m}?     X,至少 n 次,但是不超过 m 次                               Possessive 数量词             X?+     X,一次或一次也没有             X*+     X,零次或多次             X++     X,一次或多次             X{n}+     X,恰好 n 次             X{n,}+     X,至少 n 次             X{n,m}+     X,至少 n 次,但是不超过 m 次           Greedy、Reluctant、Possessive的区别

  实例说话

  看上面的表格我们发现这三种数量词的含意都相同(如X?、X??、X?+都表示一次或一次也没有),但他们之间还是有一些细微的区别的。我们先来看一个例子:
  1.Greedy

  [code]public static void testGreedy() {  
    Pattern p = Pattern.compile(".*foo");  
    String strText = "xfooxxxxxxfoo";  
    Matcher m = p.matcher(strText);  
    while (m.find()) {  
        System.out.println("matched form " + m.start() + " to " + m.end());  
    }  
}[/code]  结果:
  matched form 0 to 13
  2.Reluctant

  [code]public static void testReluctant() {  
    Pattern p = Pattern.compile(".*?foo");  
    String strText = "xfooxxxxxxfoo";  
    Matcher m = p.matcher(strText);  
    while (m.find()) {  
        System.out.println("matched form " + m.start() + " to " + m.end());  
    }  
}[/code]  结果:
  matched form 0 to 4
  matched form 4 to 13
  3.Possessive

  [code]public static void testPossessive() {  
    Pattern p = Pattern.compile(".*+foo");  
    String strText = "xfooxxxxxxfoo";  
    Matcher m = p.matcher(strText);  
    while (m.find()) {  
        System.out.println("matched form " + m.start() + " to " + m.end());  
    }  
}[/code]  结果:
  //未匹配成功
  原理讲解

  Greedy数量词被称为“贪婪的”是因为匹配器被强制要求第一次尝试匹配时读入整个输入串,如果第一次尝试匹配失败,则从后往前逐个字符地回退并尝试再次匹配,直到匹配成功或没有字符可回退。
  模式串:.*foo
  查找串:xfooxxxxxxfoo
  结果:matched form 0 to 13
  其比较过程如下
   
Java正则表达中Greedy Reluctant Possessive 的区别-1 (表达式,Java,文章)
Reluctant采用与Greedy相反的方法,它从输入串的首(字符)位置开始,在一次尝试匹配查找中只勉强地读一个字符,直到尝试完整个字符串。
  模式串:.*foo
  查找串:xfooxxxxxxfoo
  结果:matched form 0 to 4
  matched form 4 to 13
  其比较过程如下

Java正则表达中Greedy Reluctant Possessive 的区别-2 (表达式,Java,文章)

  Possessive数量词总是读入整个输入串,尝试一次(仅且一次)匹配成功,不像Greedy,Possessive从不回退,即便这样做也可能使整体匹配成功。
  模式串:.*foo
  查找串:xfooxxxxxxfoo
  结果:
  //未匹配成功
  其比较过程如下
12下一页
友荐云推荐




上一篇:IBM公布Kitura 1.0和Bluemix Runtime for Swift 3
下一篇:如何写好 README
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

靖巧 发表于 2016-10-13 02:43:23
帮顶个帖,攒人品,说不定我就会升职加薪、当上总经理、出任CEO、迎娶白富美、走上人生巅峰,嘿嘿,想想还有点小激动。
回复 支持 反对

使用道具 举报

ygiun 发表于 2016-11-21 17:24:40
OMG!介是啥东东!!!
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表