2017-05-17 187 views
0

我試圖從Java中的字符串中刪除所有非字母數字字符,但保持回車。我有以下正則表達式,但它在換行符之前和之後保持連接單詞。Java正則表達式 - 刪除除字符以外的非字母數字字符

[^\\p{Alnum}\\s] 

我該如何保存換行符或將它們轉換爲空格,以便我沒有加入單詞?

這個問題的一個例子如下所示:

原始文本

and refreshingly direct 
when compared with the hand-waving of Swinburne. 

置換後:

and refreshingly directwhen compared with the hand-waving of Swinburne. 
+0

你是什麼意思*「它在斷行前後保持連接詞」*?該正則表達式將保留所有空格和換行符,因此它不會「加入單詞」。請編輯問題並顯示您的意思。 – Andreas

回答

3

您可以添加這些字符的正則表達式,而不是\s,如\s匹配任何空格:

String reg = "[^\\p{Alnum}\n\r]"; 

或者,你可以使用character class subtraction

String reg = "[\\P{Alnum}&&[^\n\r]]"; 

這裏,\P{Alnum}匹配任何非字母數字和&&[^\n\r]防止LF和CR從匹配。

一個Java test

String s = "&&& Text\r\nNew line".replaceAll("[^\\p{Alnum}\n\r]+", ""); 
System.out.println(s); 
// => Text 
Newline 

注意,有更多的斷行字符比LF和CR。在Java 8中,\R構造匹配任何樣式換行符和it matches \u000D\u000A|\[\u000A\u000B\u000C\u000D\u0085\u2028\u2029\]

因此,要排除匹配任何換行符,您可以使用

String reg = "[^\\p{Alnum}\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029]+"; 
+1

由於Java字符串支持轉義序列,所以'\ r'和'\ n'不必被雙重轉義。 –

0

你可以使用這個表達式[^A-Za-z0-9\\n\\r]例如:

String result = str.replaceAll("[^a-zA-Z0-9\\n\\r]", ""); 

輸入

aaze03.aze1654aze987 */-a*azeaze\n hello *-*/zeaze+64\nqsdoi 

輸出

aaze03aze1654aze987aazeaze 
hellozeaze64 
qsdoi 
+0

字母數字大於[A-Za-z0-9];至少在非英語語言中(äöüéèñ...),所以你會刪除太多的 –

+1

@ P.J。Meisch:但是,OP'\ p {Alnum}'只處理ASCII。除非使用'Pattern.UNICODE_CHARACTER_CLASS'標誌,否則這是完全相同的。但是,在這個答案中只有換行符被認爲是換行符。還有更多的換行符。 –

+0

謝謝@WiktorStribiżew您的評論,所以我需要使用哪一行突破,我想我知道'\ n'還有其他人嗎? –

0

我犯了一個錯誤我的代碼。我正逐行閱讀文件並構建字符串,但沒有在每行的末尾添加空格。因此,沒有實際的換行符可以替換。

相關問題