6

我正在尝试做这样的事情:

public String evaluateString(String s){
    Pattern p = Pattern.compile("someregex");
    Matcher m = p.matcher(s);

    while(m.find()){
        m.replaceCurrent(methodFoo(m.group()));
    }
}

问题是没有 replaceCurrent 方法。也许有一个我忽略的等价物。基本上我想用在该匹配上调用的方法的返回值替换每个匹配。任何提示将不胜感激!

4

1 回答 1

11

更新:

从 Java 9 开始,我们可以使用Matcher#replaceAll​(Function<MatchResult,​String> replacer)like

String result = Pattern.compile("yourRegex")
                       .matcher(yourString)
                       .replaceAll(match -> yourMethod(match.group()));
                                         // ^^^- or generate replacement directly 
                                         // like `match.group().toUpperCase()`

在 Java 9 之前

您可以使用Matcher#appendReplacementMatcher#appendTail

appendReplacement会做两件事:

  1. 它将添加到当前匹配和前一个匹配之间的选定缓冲区文本(或第一个匹配的字符串开头),
  2. 之后,它还将为当前匹配添加替换(可以基于它)。

appendTail将添加到当前匹配之后放置的缓冲区文本。

Pattern p = Pattern.compile("yourRegex");
Matcher m = p.matcher(yourString);

StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, yourMethod(m.group()));
}
m.appendTail(sb);

String result = sb.toString();
于 2013-10-28T21:43:25.120 回答