我正在尝试替换与我的正则表达式匹配的 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
语法 wherex
是代表组号的整数, -
${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/