我正在准备 SCJP 考试,下面的模拟题让我措手不及。工具里的解释不太好,希望SO的有识之士能解释一下。
使用 C.*L
的正则表达式,识别将从 CooLooLCuuLooC
捕获的单词
我选择了CooL 和 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
或CuuL
(即以 C
开头并以 L
结尾的任何字符串)将是 C[^L]*L
。这匹配C
,然后是任意数量的非大写字符 L
,然后是大写 L
.