Skip to main content
 首页 » 编程设计

java之对正则表达式贪婪运算符和终止字符的混淆

2024年06月03日38mfrbuaa

我正在准备 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 .

第三个选项用于匹配 CooLCuuL (即以 C 开头并以 L 结尾的任何字符串)将是 C[^L]*L 。这匹配C ,然后是任意数量的非大写字符 L ,然后是大写 L .