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

标签 java regex scjp

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

关于java - 对正则表达式贪婪运算符和终止字符的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8233495/

相关文章:

java - Java 中的抽象类。

java - Netbeans 上的 PermGen 空间错误

c# - 电子邮件 ID 的正则表达式检查失败

C++ std::regex 正则表达式查找多个匹配项

javascript - 使用 javascript replace() 来匹配最后一次出现的字符串

java - Queue 接口(interface)中的 peek() 方法

java - 解码 JAXB 编码列表因空指针异常而失败

java - 通用 <T extends A> 类使用静态字段而不是 T 的静态字段

Java:将字符串转换为 Swing 表中的代码

java - 所有 Java 证书的映射在哪里?