意外的正则表达式结果

时间:2011-10-26 01:58:53

标签: java regex regex-group

我已经看过几个关于如何在分隔符之间检索和删除字符串的示例。但是,我创建了一个非常简单的测试用例,并且根据各种示例得到了错误的输出。为什么我要找回我想用作搜索源的字符串而不是我正在搜索的字符串?

String temp = "56.0 F (13.3C)";
String exp = "((^))";
String p = temp.replace(exp, "");
System.out.println("p=" + p); 

我得到字符串56.0F (13.3C)作为我的输出。

我期待得到56.0F

我也尝试使用模式匹配器:

Pattern pattern = Pattern.compile(exp);
Matcher matcher = pattern.matcher(temp);
if (matcher.find()) {
    System.out.println(matcher.groupCount());
    for (int i=0; i<=matcher.groupCount(); i++) {
        String groupStr = matcher.group(i);
        System.out.println(groupStr);
    }
}

2是打印到控制台的内容

关于我做错了什么的任何想法?我一直在看这个问题几个小时。谢谢!

2 个答案:

答案 0 :(得分:2)

它返回字符串,因为它无法进行任何替换。

尝试使用\(.*?\)\([^)]*\)来匹配括号内包围的字符串部分。

如果您希望它可选地占用周围的空格,请在正则表达式的任一侧放置\s*,或对结果进行修剪。

答案 1 :(得分:0)

您的第一个示例打印原始字符串,因为replace()方法不执行正则表达式替换。它正在尝试替换文字字符串((^)),当然这不存在。

但是,如果您使用replaceAll()replaceFirst(),则会获得相同的结果。正则表达式中的^是零宽度断言;它不会使用任何字符,它只是将匹配锚定到字符串的开头。我期望从你的第二个例子看到的结果是

> 56.0F (13.3C)
>
>

换句话说,整个字符串(group(0))和两个空字符串(group(1)group(2))。那是因为两组parens被解释为捕获组。如果要匹配(文字)括号及其内容,可以使用:

String exp = "\\(.*?\\)";

......甚至更好:

String exp = "\\([^()]*\\)";

根本不需要使用捕获组。