0

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

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 是打印到控制台的内容

关于我做错了什么的任何想法?我已经看了几个小时了。谢谢!

4

2 回答 2

2

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

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

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

于 2011-10-26T02:04:54.770 回答
0

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

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

> 56.0F (13.3C)
>
>

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

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

...甚至更好:

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

根本不需要使用捕获组。

于 2011-10-26T02:59:29.430 回答