java regex 其他实现_Java regex实现中的错误?

我在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年),或者我做错了吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值