同样的正则表达式在Java和JavaScript中有不同的结果
同样的正则表达式在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
我不明白为什么会出现这种情况?
在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代码示例,并了解断言是零宽度的,不会捕获/消耗匹配到的内容。