2011-06-01 72 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