【问题标题】:Java Regular expressions search and replaceJava 正则表达式搜索和替换
【发布时间】:2018-02-20 07:43:05
【问题描述】:

在编写具有查找和替换功能的文本编辑器时,用户可以多次搜索然后替换。在 Java 中,搜索部分非常简单:

Pattern pattern = Pattern.compile(userInput);
...
String line = ...
Matcher matcher = pattern.matcher(line);
int from = 0;
while (from < line.length() && matcher.find(from)) {
  int start = matcher.start();
  int length = matcher.end() - start;
  // pseudo-code:
  if (askUser()) {
    return ...
  }

  from = start + 1;
}

但是如何处理第 n 次匹配的替换呢? MatcherreplaceAllreplaceFirst。第一个显然不适合,但对于replaceFirst,文档说:

用给定的替换字符串替换与模式匹配的输入序列的第一个子序列。 此方法首先重置此匹配器。然后它会扫描输入序列以查找模式的匹配项。

粗体句让我担心它是否适合这里。我需要一些东西来用某种模式替换当前的匹配。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    如果要替换特定匹配,请多次调用find(),并使用start()end() 方法替换匹配部分。

    StringBuilder builder = new StringBuilder(stringToMatch);
    Matcher m = Pattern.compile(yourRegex).matcher(stringToMatch);
    for (int i = 0 ; i < n ; i++) { // n is the nth match you want to replace
        m.find();
    }
    builder.replace(m.start(), m.end(), yourReplacement);
    

    【讨论】:

    • 我想,这不会处理yourReplacement 中的正则表达式语法,对吧?
    • @ThomasS。好吧,您可以通过 m.group(1) 使用匹配的组创建替换字符串,例如,这类似于 \1
    【解决方案2】:

    如果您想替换为完整的Matcher.replaceFirst 语法,其中包括对捕获组的可能引用,您可以查看replaceFirst 的源代码。它调用Matcher 中的两个公共方法:appendReplacementappendTail。您也可以调用它们,而无需先重置匹配器,也无需调用 find

    StringBuffer sb = new StringBuffer();
    matcher.appendReplacement(sb, replacement);
    matcher.appendTail(sb);
    

    这会产生一个带有输入字符串的新 Stringbuffer,但当前匹配被替换为您的替换字符串(其中可以包含对捕获组的引用)

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 2013-06-14
      • 2018-05-25
      • 2010-11-25
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多