首页 > 解决方案 > Java Matcher 仅搜索和替换一些匹配项

问题描述

我正在使用 Matcher、find、appendReplacement 和 appendTail 在 Java 中执行标准搜索和替换循环。我的问题是我有一个附加条件必须为真,以确定我是否应该实际进行替换或在特定匹配时保持字符串完整。

Pattern p = Pattern.compile("Some Regex");
Matcher m = p.matcher("Some buffer of text which needs some replacements.");

StringBuffer updatedBuffer = new StringBuffer();
while (m.find()) {
  if (someCondition) {
    m.appendReplacement(updatedBuffer, "Some Replacement");
  }
  else {
    // leave the text unchanged at this point.
    // is there something equivalent to: m.appendOriginal(updatedBuffer)
  }
}
m.appendTail(updatedBuffer);

我可以通过使用该匹配的 end() 并从原始字符串中提取最后一个匹配的 end() 来计算这一点,但我认为可能有更有意的方法来做到这一点。谢谢你的帮助。

标签: javasearchreplaceconditional-statements

解决方案


StringBuffer updatedBuffer = new StringBuffer();
while (m.find()) {
    m.appendReplacement(updatedBuffer,
            someCondition ? "Some Replacement" : m.group());
}
m.appendTail(updatedBuffer);

或者

return Pattern.compile("Some Regex")
    .matcher("Some buffer of text which needs some replacements.")
    .replaceAll(mr -> condition ? "Some Replacement" : mr.group());

其中 mr 是类似于匹配器方法的 MatchResult。


推荐阅读