2011-06-01 42 views
3

我不明白为什么“$”是特殊的。

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

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1 

如果我改变标记=“\\ $”,那么它工作正常。但为什么它需要逃脱?提前致谢。

+0

请参阅http://stackoverflow.com/questions/11913709/why-does-replaceall-fail-with-illegal-group-reference讨论和解决方案btw。 – 2017-02-15 13:37:54

回答

6

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

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

现在更多地了解$。在正则表达式模式中,它意味着“行尾”。
在替换字符串中,$g表示“第012组”,即“g”组。因此,对于正则表达式a([a-z]+)([0-9]+),您有两个组 - $1$2,您可以在更换时参考它们。请参阅explanation here

+0

我期望第一个参数,但为什么第二个参数,应该是一个纯粹的替代?也许我不明白第二个参数的功能。 – jobobo 2011-06-01 21:43:06

+0

@ user737088我在括号中添加了有关符号的解释。我现在将扩展一下。 – Bozho 2011-06-01 21:44:01

+0

它允许您替换第一个参数中的正则表达式组中捕获的内容。你必须一路走进'Matcher.appendReplacement'查看完整的解释。 – 2011-06-01 21:45:04

0

$匹配正则表达式中该行的结尾。所以如果你需要它作为一个简单的角色,你需要逃避它。你可以找到更多在JAVA Pattern

+1

在正则表达式中就是这种情况,但该参数不是正则表达式,它是“替换”,只有\''和'$'具有特殊含义。 – 2011-06-01 21:47:17

+0

对,它不是一个正则表达式,感谢您为我指出这:)我已经看到了文档: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