帮助使用Java Matcher修改组

时间:2010-02-15 08:00:17

标签: java regex

我希望匹配正则表达式并修改匹配。这是我的功能。现在,我的方法根本不改变输入。怎么了?感谢。

    Matcher abbrev_matcher = abbrev_p.matcher(buffer);
    StringBuffer result = new StringBuffer();//must use stringbuffer here!
    while (abbrev_matcher.find()){
        //System.out.println("match found");
        abbrev_matcher.appendReplacement(result, getReplacement(abbrev_matcher));
    }
    abbrev_matcher.appendTail(result);

private static String getReplacement(Matcher aMatcher){
    StringBuilder temp = new StringBuilder(aMatcher.group(0));
    for (int i = 0; i < temp.length(); i++){
      if (temp.charAt(i) == '.'){
          temp.deleteCharAt(i);
      }

    }
    return temp.toString();
}

1 个答案:

答案 0 :(得分:1)

您只想删除匹配文字中的所有点?这里:

StringBuffer result = new StringBuffer();
while (abbrev_matcher.find()) {
    abbrev_matcher.appendReplacement(result, "");
    result.append(abbrev_matcher.group().replaceAll("\\.", ""));
}
abbrev_matcher.appendTail(result);

appendReplacement(result, "")的原因是appendReplacement查找$1$2等,因此它可以用捕获组替换它们。如果您没有将字符串文字或其他字符串常量传递给该方法,则最好避免该处理步骤并改为使用StringBuffer的append方法。否则,如果替换字符串中有任何美元符号或反斜杠,它将会爆炸。

对于您的getReplacement方法,在我的测试中, 会更改匹配的字符串,但它无法正确执行。例如,如果字符串为...blah...,则返回.blah.。这是因为,每次在StringBuilder上调用deletecharAt(i)时,都会更改所有后续字符的索引。你必须向后遍历字符串以使该方法有效,但它不值得;只需从 empty StringBuilder开始,然后按append构建字符串,而不是删除。它更有效,更易于管理。

现在我再考虑一下,你没有看到任何改变的原因可能是你的代码抛出了一个StringIndexOutOfBoundsException,你没有看到它,因为代码在try块中运行相应的catch块为空(经典Empty Catch Block反模式)。 N'est-ce pas?