0

鉴于:

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")!

谢谢你们的帮助。

4

1 回答 1

0

这些是\d*against的比赛"ab34ef"

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

这应该解释你的输出。如果量词不情愿,这将是不同的:

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

勉强的量词尽可能少地抓取以使整个表达式匹配。

于 2013-06-04T09:54:40.740 回答