2012-08-02 48 views
17

如何編寫正則表達式以匹配此\"(反斜槓然後是引號)? 假設我有一個這樣的字符串:Java - 正則表達式匹配反斜槓後加引號

<a href=\"google.com\"> click to search </a> 

我需要替換所有\"",所以結果看起來像:

<a href="google.com"> click to search </a> 

這一個不工作:str.replaceAll("\\\"", "\""),因爲它只匹配報價。不確定如何繞過反斜槓。我可以先刪除反斜槓,但我的字符串中還有其他反斜槓。

+0

在第一個參數中需要更多反斜槓。這看起來有點反直覺,但如果你想一想,這將是有道理的。 – 2012-08-02 00:45:07

+2

要在正則表達式中編寫一個文字\,使用'「\\\\」'第一個「double up」是爲了避免字符串* literal *中的斜槓(因此結果字符串* value *是\\\)。然後,第一個斜槓轉義爲正則表達式引擎中的第二個*,以便匹配一個\字符。好玩,呃? – 2012-08-02 00:50:32

+1

聽起來就像您試圖解碼可能包含轉義序列的字符串,其中反斜槓是轉義字符。當輸入包含反斜槓 - 引號時,解碼器的輸出應該是什麼?確保你爲這種情況編寫測試。 – dnault 2012-08-02 02:04:24

回答

47

如果您要更換文字和不需要正則表達式的語法,而不是replaceAll使用replace

str = str.replace("\\\","\""); 

這兩種方法將取代所有出現的目標,但replace將逐字治療目標。


但如果你真的必須使用正則表達式您正在尋找

str = str.replaceAll("\\\\\"", "\"") 

\是在正則表達式特殊字符(用於實例來創建\d - 字符類代表數字)。要使正則表達式將\視爲普通字符,您需要在其之前放置另一個\以關閉其特殊含義(您需要將其轉義)。所以我們試圖創建的正則表達式是\\

但創建表示\\字符串,所以你可能在你需要把它寫四個\"\\\\")將它傳遞給正則表達式引擎,因爲\也是字符串(它可以被用來例如作爲\t代表製表特殊字符),所以你也需要在那裏跳出\

換句話說,你需要逃跑\兩次:

  • 曾經在正則表達式\\
  • ,一次在字符串"\\\\"
+0

哦,我的...明白了。雖然有趣。萬分感謝。 – Simo 2012-08-02 01:54:06

6

你並不需要一個正則表達式。

str.replace("\\\"", "\"") 

應該工作得很好。

replace方法需要兩個子字符串並將第一個和第二個的所有非重疊事件替換掉。每javadoc

public String replace(CharSequence target, 
         CharSequence replacement) 

替換此字符串與指定的文字替換序列字面目標序列匹配的每個子字符串。替換從字符串的開頭進行到結尾,例如,用字符串"aaa"中的"b"代替"aa"將導致"ba"而不是"ab"

0

試試這個:str.replaceAll("\\\\\"", "\\\"")
因爲Java將取代\兩次:

(1)\\\\\" - >\\"(字符串)
(2)\\" - >\"(爲正則表達式)

相關問題