2017-08-24 54 views
0

我想從我的字符串中刪除\ n和\。首先,我刪除了斷路器,然後刪除了反斜槓。我無法一步到位。我是這樣做的。爲什麼我們用反斜線替換Java中的特殊字符?

Step 1

String query = " \"id\" \\$ \\nVD \\"; 
    System.out.println(query); // "id" \$ \nVD \ 

Step2

query = query.replaceAll("\\\\n", ""); 
    System.out.println(query); //"id" \$ VD \ 

Step 3

query = query.replace("\\", ""); 
    System.out.println(query); // "id" $ VD  

在步驟2中,我使用了replaceAll刪除斷路器(\ n)。

在步驟3中,我使用了替換從字符串中刪除反斜槓。第2步是試圖找到與n ie反斜槓。 \ n(線斷路器),因此它避免了\(反斜槓)。我瞭解到,由於反斜槓是一個特殊字符,因此我們再使用一個字符來將其識別爲字符串替換方法中的字面值。

但是在第2步中,爲什麼我們使用三個反斜槓替換斷路器?

回答

0

您需要鍵入它們兩次,因爲String.replaceAll方法使用正則表達式,而在正則表達式中,返回符號與字符串字符串\n相匹配。 Java語法將字符串中的\n轉義爲單個ASCII符號。那麼如何通過正則表達式的\n字符串呢?你需要逃避它第二次,這導致雙反斜線逃逸 - \\,這對於\n\\n

,並在你的第二步,你不需要"\\\\n"你需要它,你應該使用"\\n"

"\\"第三步instad你應該使用"\\\\",bacause沒有了正則表達式會看到一個反斜槓不具備所要求的指令後,你會得到這樣的錯誤:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 
\ 
^ 
    at java.util.regex.Pattern.error(Pattern.java:1955) 
    at java.util.regex.Pattern.compile(Pattern.java:1702) 
    at java.util.regex.Pattern.<init>(Pattern.java:1351) 
    at java.util.regex.Pattern.compile(Pattern.java:1028) 
    at java.lang.String.replaceAll(String.java:2223) 
    at Test.main(Test.java:33) 

可以逃脫既\"\n"在使用此單一行一個步驟(在|像或正則表達式)

query = query.replaceAll("\\n+|\\\\", ""); 
0
A character preceded by a backslash (\) is an escape sequence and has special meaning to the compiler. 

從這個source

1

在步驟2時,實際上是使用4背面(未「黑「)斜槓替換\n字符。

您的字符串中的\n實際上並不是新行。它們代表\n字符。要使用Java代碼編寫此代碼,您需要使用另一個\來轉義\。因此,要表達\n在Java中的字符串,你需要做的:

String s = "\\n"; 

現在讓我們來看看replaceAllreplaceAll需要一個正則表達式並將其替換爲字符串中的每一個匹配項。在這種情況下,您希望匹配\後跟n。你不能只是使用正則表達式是這樣的:

\n 

因爲\n手段「以配合新線」的正則表達式。你只想匹配\n

因此,您必須使用另一個\來逃避\。此正則表達式匹配\後跟n

\\n 

現在,你有你的正則表達式,你需要把它寫在Java代碼。您需要在Java字符串中表示「2 \」和「n」。要做到這一點,你需要一個\來逃避字符串中的每個\。這就是爲什麼你最終

"\\\\n" 

上述手段\\n在正則表達式,它的字面匹配\n