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

53 浏览
0 Comments

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

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

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()); // 输出 false

JavaScript

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

我不明白为什么会出现这种情况?

0
0 Comments

在Java和JavaScript中,相同的正则表达式在使用Matcher#matches()方法和String#matcher()方法时会产生不同的结果。这是因为Java的Matcher#matches()方法会尝试将整个输入与模式进行匹配,而JavaScript的String#matcher()方法则不会。

具体来说,问题出在正则表达式的右侧部分,它是一个零宽度的正向先行断言。在Java中,Matcher#matches()方法会尝试将整个输入与正则表达式进行匹配,但由于正则表达式的右侧部分是一个零宽度的断言,它只能匹配到"Windows",而无法匹配到"2000"。

为了解决这个问题,我们可以使用更好的Java代码示例来展示问题并说明它并不是真的“有问题”。下面是一个更好的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()); // 输出 "Windows"
}

在这个示例中,我们使用了正向先行断言,将正则表达式修改为"Windows(?=95|98|NT|2000)"。运行这段代码,我们会看到输出结果为"Windows",这就是实际匹配到的内容。

需要注意的是,断言是零宽度的,也就是说在断言中匹配到的内容不会被捕获/消耗掉。在上面的Java代码示例中,我们可以看到断言部分并没有被输出。

在JavaScript中,String#matcher()方法也存在类似的问题。它返回的结果是false,因为它并没有尝试将整个输入与正则表达式进行匹配。

Java和JavaScript中相同的正则表达式在使用Matcher#matches()方法和String#matcher()方法时会产生不同的结果。这是因为Java的Matcher#matches()方法会尝试将整个输入与模式进行匹配,而JavaScript的String#matcher()方法则不会。为了解决这个问题,我们可以使用更好的Java代码示例,并了解断言是零宽度的,不会捕获/消耗匹配到的内容。

0