我在Java的regex实现中发现了一些意想不到的行为。使用
java.util.regex.Pattern和
java.util.regex.Matcher时,使用Matcher’s
find()方法时,以下正则表达式在输入“Merlot”上不正确:
((?:White )?Zinfandel|Merlot)
如果我改变最外层匹配组内的表达式的顺序,Matcher的find()方法匹配。
(Merlot|(?:White )?Zinfandel)
这里是一些说明问题的测试代码。
RegexTest.java
import java.util.regex.*;
public class RegexTest {
public static void main(String[] args) {
Pattern pattern1 = Pattern.compile("((?:White )?Zinfandel|Merlot)");
Matcher matcher1 = pattern1.matcher("Merlot");
// prints "No Match :("
if (matcher1.find()) {
System.out.println(matcher1.group(0));
} else {
System.out.println("No match :(");
}
Pattern pattern2 = Pattern.compile("(Merlot|(?:White )?Zinfandel)");
Matcher matcher2 = pattern2.matcher("Merlot");
// prints "Merlot"
if (matcher2.find()) {
System.out.println(matcher2.group(0));
} else {
System.out.println("No match :(");
}
}
}
预期输出为:
Merlot
Merlot
但实际输出是:
No Match :(
Merlot
我已经验证这个意外的行为存在于Ubuntu linux上的Java 1.7.0_11版本以及OSX 10.8.2上的Java版本1.6.0_37。我将此行为作为一个bug报告给Oracle昨天,并回来了一个自动电子邮件告诉我我的错误报告已收到,并有一个内部审查ID为2441589.当我在他们的错误中搜索该ID找不到我的错误报告数据库。 (你能听到蟋蟀吗?)
我发现了一个Java的大概是彻底测试和使用正则表达式实现(难以相信2013年),或者我做错了吗?