2012-11-06 60 views
0

我正在編寫應該從文本塊中刪除實際換行符的代碼,並將其替換爲字符串「\ n」。然後,當字符串在另一次讀取時,它應該替換換行符(換句話說,搜索所有「\ n」並插入\n。但是,雖然第一次轉換工作正常,但它沒有做後者。彷彿第二取而代之的是無爲爲什麼爲什麼刪除它們後重新插入換行符無效?

的更換:?

theString.replaceAll(Constants.LINE_BREAK, Constants.LINE_BREAK_DB_REPLACEMENT); 

重新代替:

theString.replaceAll(Constants.LINE_BREAK_DB_REPLACEMENT, Constants.LINE_BREAK); 

常量:

public static final String LINE_BREAK = "\n"; 
public static final String LINE_BREAK_DB_REPLACEMENT = "\\\\n"; 
+1

也許這應該是「\\ N」的; –

+0

你實際上是用\\ n來代替換行符,但是如果你使用相同的常量來代替原來的代碼,這應該沒有什麼區別。 – jalynn2

+3

值得注意的是,即使您修復了當前問題,轉換也是有損的:如果原始字符串包含反斜槓字符後跟字母'n',則將其轉換爲換行符將會將其轉換爲換行符。 – NPE

回答

1

String.replaceAll(regex, replacement),無論是正則表達式串和替換字符串治療反斜槓作爲轉義字符:

  • regex表示regular expression,其逸出反斜槓作爲\\
  • replacement是一個替換字符串,這也逸出反斜槓:

請注意,反斜槓(\)和美元si替換字符串中的gns($)可能會導致結果與將它視爲字面替換字符串時的結果不同;看Matcher.replaceAll。

這意味着反斜槓必須在兩個參數進行轉義。此外,字符串常量也使用反斜槓作爲轉義字符,因此傳遞給該方法的字符串常量中的反斜槓必須雙重轉義(另請參見this question)。

這對我工作得很好:

// Replace newline with "\n" 
theString.replaceAll("\\n", "\\\\n"); 

// Replace "\n" with newline 
theString.replaceAll("\\\\n","\n"); 

您還可以使用Matcher.quoteReplacement()方法來治療替換字符串作爲文字:

// Replace newline with "\n" 
theString.replaceAll("\\n", Matcher.quoteReplacement("\\n")); 
// Replace "\n" with newline 
theString.replaceAll("\\\\n",Matcher.quoteReplacement("\n")); 
1

在最後一次replaceAll()方法調用中不需要四個反斜槓。 這似乎對做工精細我

String str = "abc\nefg\nhijklm"; 

    String newStr = str.replaceAll("\n", "\\\\n"); 

    String newnewStr = newStr.replaceAll("\\\\n", "\n"); 

輸出是:

ABC
EFG
hijklm
ABC \ nefg \ nhijklm
ABC
EFG
hijklm

我認爲這是你的預期。

相關問題