替换为"$"时replaceFirst()失败

job*_*obo 3 java regex string

我不明白为什么"$"很特别.

String str = "bla aa";
String tag = "$";
str = str.replaceFirst("aa", tag);

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
Run Code Online (Sandbox Code Playgroud)

如果我更改tag ="\\ $",那么它可以正常工作.但为什么需要逃脱呢?提前致谢.

Boz*_*zho 6

因为它是一个特殊的正则表达式符号(结果是关于捕获组),并且replaceFirst采用正则表达式参数.文档明确警告您:

请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同; 请参阅Matcher.replaceFirst(java.lang.String).如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义.

现在再说一点$.在正则表达式模式中,它意味着"行尾".
在替换字符串中,$g表示"第g组".因此对于正则表达式a([a-z]+)([0-9]+),您有两个组 - $1并且$2,您可以在替换时引用它们.请参阅此处说明