2

我正在准备 SCJP 考试,下面的模拟题让我措手不及。该工具中的解释不是很好,所以我希望SO的知识渊博的人能够解释它。

使用 的正则表达式C.*L,识别它将从中捕获的单词CooLooLCuuLooC

我选择了CooL and CuuL。我选择这个的原因是因为我相信它会寻找 C 的起始匹配,然后取任何字符零次或多次,直到找到一个L,然后终止。

然而,答案其实是CooLooLCuuL。我很困惑前 2 是如何L通过的?

谁能帮我解决这个问题?

谢谢

4

3 回答 3

3

还有一种可能有用的解释:

匹配任何东西(.*默认情况下,换行符除外!!!!),零次或多次 - 你通常理解这一点。但是,.*?也符合该定义。不同的是贪婪...

  • .*将匹配任何东西,直到它无法匹配其他任何东西(“贪婪”或“渴望”)
  • .*?将匹配任何内容,直到可以匹配以下表达式(“非贪婪”或“不情愿”)

因此,C.*L会找到一个大写字母,C然后匹配ooLooLCuuLooC.*然后它会发现它必须匹配一个大写字母L。在字符串的末尾,这是不可能的,所以它会转到可以匹配的地方L,迫使.*放弃字符LooC以便这样做。结果:CooLooLCuuL

如果你用C.*?L它会找到C,然后匹配o,测试下o一个匹配来L。这将失败,使其匹配oo并测试下L一个匹配到L. 这会成功并且会返回CooL

匹配CooLor CuuL(即任何以 开头C和结尾的字符串L)的第三个选项是C[^L]*L. 这匹配C,然后是任意数量的不是大写字母的字符L,然后是大写字母L

于 2011-11-22T21:03:55.397 回答
2

C.*L匹配CooLooLCuuL,因为它是贪婪的。它会在仍然找到匹配项的同时尝试尽可能多地咀嚼,直到您要匹配的字符串中没有剩余的字符串才能找到有效匹配项。C.*?L是非贪婪的,因此 match CooL,因为它会在找到第一个匹配项时得到满足。它甚至会留下足够的字符串以CuuL找到第二个匹配项。

于 2011-11-22T20:43:37.407 回答
2

这是因为它是一个greedy search并且会匹配尽可能多的字符,然后回溯直到找到一个L字符。

这是获取有关此事的更多信息的绝佳资源:http ://www.regular-expressions.info/repeat.html

于 2011-11-22T20:45:33.467 回答