相同的正则表达式在 Java 和 JavaScript 中的结果不同

yug*_*uge 6 javascript java regex

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

爪哇

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
Run Code Online (Sandbox Code Playgroud)

JavaScript

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

我不明白为什么会这样?

Tim*_*sen 5

从 JavaMatcher#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"
}
Run Code Online (Sandbox Code Playgroud)

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