java - 非法参数异常 : Illegal group reference while replaceFirst

标签 java regex

我正在尝试替换与我的正则表达式匹配的 String 的第一次出现,同时像这样迭代这些出现:

(这段代码已经很简化了,所以不要试图去寻找一些更大的意义)

Matcher tagsMatcher = Pattern.compile("\\{[sdf]\\}").matcher(value);

int i = 0;
while (tagsMatcher.find()) {
    value = value.replaceFirst("\\{[sdf]\\}", "%" + i + "$s");
    i++;
}

我在执行 replaceFirst 时收到 IllegalArgumentException: Illegal group reference。为什么?

最佳答案

replacement参与replaceFirst(regex,replacement)可以包含对与 regex 匹配的组的引用.为此,它使用

  • $x语法 where x是代表组号的整数,
  • ${name}其中 name是命名组的名称 (?<name>...)

因为这个能力$replacement 中被视为特殊字符, 所以如果你想制作 $你需要的文字

  • \ 转义喜欢replaceFirst(regex,"\\$whatever")
  • 或者让Matcher使用 Matcher.quote 为您转义方法 replaceFirst(regex,Matcher.quote("$whatever"))

但是你不应该使用

value = value.replaceFirst("\\{[sdf]\\}", "%" + i + "\\$s");

在循环里面因为每次都需要遍历整个字符串才能找到要替换的部分,所以每次都需要从头开始,效率很低。

正则表达式引擎以 matcher.appendReplacement(StringBuffer, replacement) 的形式解决了这种低效率问题和 matcher.appendTail(StringBuffer) .

  • appendReplacement方法将所有数据添加到 StringBuffer 直到当前匹配,并允许您指定应该用什么代替正则表达式部分匹配
  • appendTail添加最后匹配部分之后存在的部分

所以你的代码应该看起来更像

StringBuffer sb = new StringBuffer();
int i = 0;

Matcher tagsMatcher = Pattern.compile("\\{[sdf]\\}").matcher(value);
while (tagsMatcher.find()) {
    tagsMatcher.appendReplacement(sb, Matcher.quoteReplacement("%" + (i++) + "$s"));
} 
value = sb.toString();

关于java - 非法参数异常 : Illegal group reference while replaceFirst,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30692733/

相关文章:

java - 在 Intellij 中将 Java 项目转换为 Gradle 项目

java - Spring的@Transactional注解是否会混淆其他注解

regex - 如何替换r中某列中字符串的第n个字符

regex - Vim:匹配行尾的空格但不匹配由单个空格组成的行

php - 正则表达式捕获两位数字仅当字符串中没有其他数字时

c# - 正则表达式捕获文件名中的第一个/最后一个词

java - DATE 格式是否会影响日期的比较方式?

java - 使用 URLConnection 加载 xml 内容时出现垃圾

c# - 为盲人提供无障碍应用

c# - 在 C# 中使用正则表达式从完整路径解析文件名