我正在准备 SCJP 考试,下面的模拟题让我措手不及。该工具中的解释不是很好,所以我希望SO的知识渊博的人能够解释它。
使用 的正则表达式C.*L
,识别它将从中捕获的单词CooLooLCuuLooC
我选择了CooL and CuuL
。我选择这个的原因是因为我相信它会寻找 C 的起始匹配,然后取任何字符零次或多次,直到找到一个L
,然后终止。
然而,答案其实是CooLooLCuuL
。我很困惑前 2 是如何L
通过的?
谁能帮我解决这个问题?
谢谢
还有一种可能有用的解释:
匹配任何东西(.*
默认情况下,换行符除外!!!!),零次或多次 - 你通常理解这一点。但是,.*?
也符合该定义。不同的是贪婪...
.*
将匹配任何东西,直到它无法匹配其他任何东西(“贪婪”或“渴望”).*?
将匹配任何内容,直到可以匹配以下表达式(“非贪婪”或“不情愿”)因此,C.*L
会找到一个大写字母,C
然后匹配ooLooLCuuLooC
。.*
然后它会发现它必须匹配一个大写字母L
。在字符串的末尾,这是不可能的,所以它会转到可以匹配的地方L
,迫使.*
放弃字符LooC
以便这样做。结果:CooLooLCuuL
如果你用C.*?L
它会找到C
,然后匹配o
,测试下o
一个匹配来L
。这将失败,使其匹配oo
并测试下L
一个匹配到L
. 这会成功并且会返回CooL
。
匹配CooL
or CuuL
(即任何以 开头C
和结尾的字符串L
)的第三个选项是C[^L]*L
. 这匹配C
,然后是任意数量的不是大写字母的字符L
,然后是大写字母L
。
C.*L
匹配CooLooLCuuL
,因为它是贪婪的。它会在仍然找到匹配项的同时尝试尽可能多地咀嚼,直到您要匹配的字符串中没有剩余的字符串才能找到有效匹配项。C.*?L
是非贪婪的,因此 match CooL
,因为它会在找到第一个匹配项时得到满足。它甚至会留下足够的字符串以CuuL
找到第二个匹配项。
这是因为它是一个greedy search
并且会匹配尽可能多的字符,然后回溯直到找到一个L
字符。
这是获取有关此事的更多信息的绝佳资源:http ://www.regular-expressions.info/repeat.html