我不明白爲什麼「$」是特殊的。
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