【问题标题】:Same regex have different results in Java and JavaScript [duplicate]相同的正则表达式在 Java 和 JavaScript 中具有不同的结果 [重复]
【发布时间】:2020-04-17 06:14:20
【问题描述】:

相同的正则表达式,不同的结果;

Java

String regex = "Windows(?=95|98|NT|2000)";
String str = "Windows2000";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
System.out.println(m.matches()); // print false

JavaScript

var value = "Windows2000";
var reg = /Windows(?=95|98|NT|2000)/;
console.info(reg.test(value)); // print true

我不明白为什么会这样?

【问题讨论】:

  • 这可能是因为 matches() 在要测试的 whole 字符串匹配时返回 true。 (积极的前瞻不是匹配的一部分)

标签: javascript java regex


【解决方案1】:

来自 Java 的 Matcher#matches() 方法的文档:

尝试将整个区域与模式匹配。

匹配器 API 正在尝试将您的模式应用于整个输入。这失败了,因为 RHS 部分是零宽度正向超前。所以,它可以匹配Windows,但是2000部分不匹配。

一个更好的 Java 代码版本,表明它没有真正“损坏”,应该是这样的:

String regex = "Windows(?=95|98|NT|2000)";
String str = "Windows2000";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()) {
    System.out.println(m.group()); // prints "Windows"
}

现在我们看到 Windows 正在打印,这是匹配的实际内容。

【讨论】:

  • @VishwaRatna Lookarounds 是 零宽度,这意味着 nothing 将永远不会从前瞻中被捕获/消耗(好吧......有例外,例如作为在环顾中捕获的反向引用,但这是一个边缘情况)。只需运行我的 Java 代码,您就会看到这里发生了什么。
  • @TimBiegeleisen String#matcher() 也返回 false;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2022-06-10
  • 2018-06-04
  • 1970-01-01
  • 2012-09-04
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多