使用Java Matcher修改组的帮助

使用Java Matcher修改组的帮助,java,regex,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 fou

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

    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();
}
Matcher abbrev\u Matcher=abbrev\u p.Matcher(缓冲区);
StringBuffer结果=新的StringBuffer()//必须在这里使用stringbuffer!
while(abbrev_matcher.find()){
//System.out.println(“找到匹配项”);
appendReplacement(结果,getReplacement(abbrev_matcher));
}
abbrev_matcher.appendTail(结果);
私有静态字符串getReplacement(匹配器aMatcher){
StringBuilder temp=新的StringBuilder(匹配器组(0));
对于(int i=0;i您只想删除匹配文本中的所有点?在这里:

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)
,都会更改所有后续字符的索引。您必须向后迭代字符串才能使该方法起作用,但这不值得;只需从一个空的StringBuilder开始,通过添加而不是删除来构建字符串。它更高效,也更容易管理


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

或者如果您知道任何其他动态更换方法。我找到了这段代码,但它只使用toLowerCase()字符串方法。i、 它不是可定制的。或者,如果您知道任何其他方法来进行动态更换。我找到了这段代码,但它只使用toLowerCase()字符串方法。i、 它不是可定制的。谢谢你的帮助,艾伦,但这不是我想要做的。“点删除”只是一个例子。我想做更复杂的动态替换,比如匹配不同形式的日期:“2005年10月10日;2005年10月10日;2005年10月10日”,并将其正常化。使用这些helper方法可能不可能做到这一点:-/当然可能,而且您所采用的方法恰好正确。你只是在你发布的代码中有一个不明显的错误。尝试使用Elliott Hughes的Rewriter类,这样您只需编写
替换
方法:谢谢您的帮助,Alan,但这并不是我想要做的。“点删除”只是一个例子。我想做更复杂的动态替换,比如匹配不同形式的日期:“2005年10月10日;2005年10月10日;2005年10月10日”,并将其正常化。使用这些helper方法可能不可能做到这一点:-/当然可能,而且您所采用的方法恰好正确。你只是在你发布的代码中有一个不明显的错误。尝试使用Elliott Hughes的重写器类,这样您只需编写
替换方法