2011-11-22 17 views
2

我正在学习SCJP考试,下面的模拟问题引起了我的注意。该工具中的解释并不是很好,所以我希望SO的知识渊博的人能够解释它。关于正则表达式贪婪算子的混乱,并终止字符

随着C.*L正则表达式,确定从CooLooLCuuLooC

我选择CooL and CuuL将捕捉的话。我之所以选择这个选择是因为我相信它会寻找C的开始匹配,然后将任何字符零次或多次直到找到一个L,然后终止。

但是,答案实际上是CooLooLCuuL。我很困惑第一个2 L是如何完成的?

任何人都可以请为我清除这个?

感谢

+2

你写了同样的答案两次... – OrangeDog

+0

对不起,现在已经修复:) – Jimmy

回答

3

只要再一个可能有用的解释:

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

  • .*直到不​​能匹配任何东西都不会匹配任何东西(“贪婪”或“渴望”)
  • .*?将匹配任何东西,直到下面的表达式可以匹配(”非贪婪”或 '不愿意')

因此,C.*L会发现资本C,然后用.*匹配ooLooLCuuLooC。它会发现它必须匹配首都L。在字符串末尾,这是不可能的,所以它会到达与L匹配的位置,迫使.*放弃字符LooC以便这样做。结果:CooLooLCuuL

如果你使用C.*?L它会找到C,再搭配o,测试了比赛的下一个oL。这会失败,使其匹配oo并测试下一个LL匹配。这会成功,它会返回CooL

匹配任一CooLCuuL第三个选项(即,与C开始和结束L任何字符串)将是C[^L]*L。这与C匹配,然后是不是大写字母L,然后是大写字母L的任意数量的字符。

+0

为什么C。*?L也会匹配Cuul?!它看起来会。 – despot

+1

@despot - 不完全是_sure_你的问题是什么,但是如果你的问题是“会”,那么除了任何拼写错误,'Cuul'不会被匹配,因为它以'l'结尾(小写字母el)除了'CooL'之外,*'L'匹配'CuuL'“,那么答案是”是的,如果它以超过第一个匹配'CooL'的方式运行;例如,使用'matchAll ()'键入函数或在找到'CooL'匹配后重新开始搜索,可能从索引4+开始“。顺便说一句,它也会匹配'C - L','CqwERtyL',甚至是'C%@((*&^ $%L' –

+0

抱歉,错字 - “会”应该是“不会”。 – despot

2

C.*L匹配CooLooLCuuL因为它是贪婪的。它会尝试咀嚼尽可能多的东西,同时仍然会找到一个匹配,直到找不到匹配的字符串的剩余部分以找到有效匹配为止。 C.*?L非贪婪,因此匹配CooL,因为在找到第一个匹配项时它会被满足。它甚至会留下足够的字符串,以便找到第二场比赛CuuL