如何准确识别&工作贪婪或不情愿的量词?

时间:2013-06-04 09:49:45

标签: java regex scjp quantifiers

假设:

import java.util.regex.*;

class Regex2 {    
  public static void main (String args[]) {
    Pattern p = Pattern.compile(args[0]);
    Matcher m = p.matcher (args [1]);    
    boolean b = false;

    while (m. find()) {
       System.out.print(m.start()  + m.group());
    }
  }
}

命令行表达式为:

java Regex2 "\d*" ab34ef

结果是什么?

A. 234
B. 334
C. 2334
D 0123456
E. 01234456
F. 12334567
G. Compilation fails

SCJP的书解释了正则表达式,模式和匹配器如此可怕,令人难以置信。 无论如何,我几乎了解了大多数基础知识,并查看了有关贪婪和不情愿量词的Sun / Oracle文档。我理解这些概念,但对于一些事情我是模糊的:

“贪婪”量词的物理符号究竟是什么?它只是一个*,?还是+? 如果是这样,有人可以根据这本书详细解释这个答案是如何变成E的吗?当我自己运行时,我得到答案:2334!

这里我们将使用贪心量词正确吗?这将消耗整个字符串,然后回溯并查找一行中的零个或多个数字。因此,如果贪婪,'完整字符串'将包含一行中的2位数,并且只执行一次.find()(即.m.start = 0,m.group =“ab34ef”),按此定义!

感谢帮助人员。

1 个答案:

答案 0 :(得分:0)

这些是\d*"ab34ef"的匹配:

  • 索引0:零宽度;
  • 索引1:零宽度;
  • 索引2:“34”;
  • 索引4:零宽度;
  • 索引5:零宽度;
  • 索引6:零宽度。

这应该解释你的输出。如果量词不情愿,那就是区别:

  • 索引2:零宽度;
  • 索引3:零宽度;

不情愿的量词会尽可能少地抓取整个表达式。