2013-08-29 46 views
1

我想替換這不是在提供的列表如何表示反斜線

[^-\\dA-Za-zÂÃâ`[email protected]#$%^&*()_+=[{]}:;<,>.?/ ] 

我想包括在此列表中的反斜槓\,讓反斜線不會被取代。 如果我給這樣的

.replaceAll("[^-\\dA-Za-zÂÃâ`[email protected]#$%^&*()_+=[{]}\\:;<,>.?/ ]","") 

它不工作如我所料。

"xyda\asff"..replaceAll("[^-\\dA-Za-zÂÃâ`[email protected]#$%^&*()_+=[{]}\\:;<,>.?/ ]","") 

Expected result :: xyda\asff 
Output :: xydaasff 

我不想更換\

回答

2

到代碼後,正則表達式一個反斜槓,你需要反斜槓(\\\\)中的代碼(見最後一個字符):

[^-\\dA-Za-zÂÃâ`[email protected]#$%^&*()_+=[{]}:;<,>.?/ \\\\] 

每對反斜槓是字符串中的單個反斜槓,並且您需要其中的兩個,所以它在正則表達式中會進一步轉義;你需要逃避逃跑。


我們會在java中逃避這種編碼眼光嗎? (努力爭取雙關)

+0

如果你只是在開始時添加這個額外的「反斜槓」,你會錯過'\ d'(數字)。所以數字將被替換以及... – Sambuca

+1

@Sambuca yikes!有罪:我撇去了正則表達式:/。現在修復。謝謝 – Bohemian

1

您需要使用另一個斜槓轉義斜線。所以\成爲\\

的正則表達式我相信你需要再次逃脫它...

.replaceAll("[^-\\dA-Za-zÂÃâ[email protected]#$%^&*()_+=[{]}\\:;<,>.?/ ]","") 
       ^^       ^^ 

如果您需要包括\斜線,以及,你將需要避免像\\\\

+0

感謝它的工作,因爲我預期 – Raghunath

4

您需要申請兩個級別的轉義 - 一個用於正則表達式本身,另一個用於Java字符串文字。這意味着您需要連續使用四個反斜槓。所以:

replaceAll("[^-\\dA-Za-zÂÃâ`[email protected]#$%^&*()_+=[{]}\\:;<,>.?/\\\\ ]", "") 

我承擔\\d是爲了覆蓋任何數字,而非實際d名單?

您可能會發現將模式打印到控制檯最容易,因此您可以準確瞭解正則表達式引擎所看到的內容,而不會導致Java字符串文字轉義相關。上面的圖案是:

[^-\dA-Za-zÂÃâ`[email protected]#$%^&*()_+=[{]}\:;<,>.?/\\ ] 

因此,與反斜線的比特是:

  • \d(數字)
  • \:(結腸)
  • \\(反斜槓)
1

要在作爲字符串文獻提供的java正則表達式中有一個文字反斜槓在代碼中,你需要四個反斜槓。

\\\\

這是因爲你想\\是在實際的正則表達式,但是編譯器還着眼於\作爲字符串文字的轉義,所以你需要再次逃脫每一個通過進入得到它運行時的實際字符串!