如何精确地识别和工作贪婪或不情愿的量词?



给定:

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!

这里我们将使用贪婪的量词,对吗?这将消耗整个字符串,然后回溯并在一行中查找零个或多个数字。因此,如果贪婪,"完整字符串"将在一行中包含两个数字,并且根据该定义,将只执行.find((一次(即m.start=0,m.group="ab34ef"(!

谢谢你们的帮助。

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

  • 索引0:零宽度
  • 索引1:零宽度
  • 索引2:"34">
  • 索引4:零宽度
  • 索引5:零宽度
  • 索引6:零宽度

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

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

不情愿的量词尽可能少地抓取,以使整个表达式匹配。

相关内容

  • 没有找到相关文章

最新更新