相同的正则表达式在 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
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 中具有不同的结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章