【问题标题】:Unexpected Regex Results意外的正则表达式结果
【发布时间】:2011-10-26 01:58:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: java regex regex-group


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 alex,这现在可以完美运行(除了我必须在左右括号之前使用 \\ 转义序列:\(.*?\)。
    【解决方案2】:

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

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

    > 56.0F (13.3C)
    >
    >
    

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

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

    ...甚至更好:

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

    根本不需要使用捕获组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多