相同的正则表达式在 Java 和 JavaScript 中具有不同的结果 [重复]

Posted

技术标签:

【中文标题】相同的正则表达式在 Java 和 JavaScript 中具有不同的结果 [重复]【英文标题】:Same regex have different results in Java and JavaScript [duplicate] 【发布时间】: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。 (积极的前瞻不是匹配的一部分) 【参考方案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;

以上是关于相同的正则表达式在 Java 和 JavaScript 中具有不同的结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java转义符和正则表达式转义符

如何在不同的编程语言中使用相同的正则表达式?

请问java的正则表达式和php的正则表达式通用吗

java或者正则表达式如何判断字符串不是相同数字或者字母?不能全是连续数字?(最好是java)

正则 表达式(替换)// 引用

Java 正则表达式详解