我不明白为什么“$”是特殊的。
String str = "bla aa";
String tag = "$";
str = str.replaceFirst("aa", tag);
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
如果我改变标记=“\\ $”,那么它工作正常。但为什么它需要逃脱?提前致谢。
我不明白为什么“$”是特殊的。
String str = "bla aa";
String tag = "$";
str = str.replaceFirst("aa", tag);
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
如果我改变标记=“\\ $”,那么它工作正常。但为什么它需要逃脱?提前致谢。
因为它是一个特殊的正则表达式符号(结果是关于捕获组),并且replaceFirst
需要正则表达式参数。该文档明确警告您:
请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将它视为字面替换字符串时不同;看Matcher.replaceFirst(java.lang.String)。如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。
现在更多地了解$
。在正则表达式模式中,它意味着“行尾”。
在替换字符串中,$g
表示“第012组”,即“g”组。因此,对于正则表达式a([a-z]+)([0-9]+)
,您有两个组 - $1
和$2
,您可以在更换时参考它们。请参阅explanation here
先替换需要正则表达式。根据Pattern javadoc$
匹配一行的结尾。
$匹配正则表达式中该行的结尾。所以如果你需要它作为一个简单的角色,你需要逃避它。你可以找到更多在JAVA Pattern
在正则表达式中就是这种情况,但该参数不是正则表达式,它是“替换”,只有\''和'$'具有特殊含义。 – 2011-06-01 21:47:17
对,它不是一个正则表达式,感谢您为我指出这:)我已经看到了文档:http://download.oracle.com/javase/6/docs/api/java/util/regex/Matcher。HTML#appendReplacement(java.lang.StringBuffer中,java.lang.String中\) – oyo 2011-06-03 06:31:44
请参阅http://stackoverflow.com/questions/11913709/why-does-replaceall-fail-with-illegal-group-reference讨论和解决方案btw。 – 2017-02-15 13:37:54