2016-11-05 148 views
1

我試圖從文本塊中的行中刪除所有空格,這些行中除空格之外什麼都不包含,使行中斷。Java replaceAll從空行中刪除空格

我嘗試以下:

str = " text\n \n \n text";  
str = str 
    .replaceAll("\\A +\\n", "\n") 
    .replaceAll("(\\n +\\n)", "\n\n") 
    .replaceAll("\\n +\\Z", "\n"); 

我期待的輸出是

" text\n\n\n text" 

而是它是

" text\n\n \n text" 

在塊的第三行中的空間沒有被刪除。我在這裏做錯了什麼?

+0

請檢查並選擇最適合您的答案。 –

回答

2

你需要匹配,只有水平空間線,並在需要Pattern.MULTILINE修改爲^$錨分別匹配的開始和結束(其隱含期權是(?m))。使用

String str = " text\n \n \n text"; 
str = str.replaceAll("(?m)^[\\p{Zs}\t]+$", ""); 

查看Java demo

詳細

  • (?m) - 多行模式
  • ^ - 1或多個水平空格
  • $ - - 線的端線
  • [\\p{Zs}\t]+的開始。

一種替代[\p{Zs}\t]是匹配不含垂直空白符號的任何空白的圖案。在Java中,可以方便地使用字符類減法:[\s&&[^\r\n]]其中[\s]與任何空格匹配,並且&&[^\r\n]從中排除回車符和換行符。完整模式看起來像.replaceAll("(?Um)^[\\s&&[^\r\n]]+$", "")

+0

它總是更好的細節:) – Treycos

+0

'\ p {Zs}'是什麼?我似乎無法在[文檔](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)中找到它。它是否與'\ h'相同? – 4castle

+0

@ 4castle:不完全是,\ p {Zs}是一個Unicode屬性類,它匹配所有Unicode水平空白字符,但是是一個製表符。所以,它不等於PCRE'\ h'。 –

1

使用錨:

str = str.replaceAll("(?m)^[^\\S\\n]+$", ""); 

^$比賽分別開始和行結束時,多標誌(?m)接通。

您的模式的問題是,您使用\\n圍繞水平空格replaceAll("(\\n +\\n)", "\n\n")(您的模式中的簡單空格)。如果你這樣做,你不能獲得連續的結果,因爲你不能匹配兩次相同的人物。

注:添加最終\\r在字符類(將其排除爲\\n如果你想利用帳戶的Windows或線條的舊的Mac結束。

3

使用MULTILINE標誌,以便^$將匹配每行的開始和結束。你的正則表達式的問題是它正在捕獲換行符,所以下一場比賽將超過它,並且無法匹配。

str.replaceAll("(?m)^ +$", "") 
+0

感謝大家提供的信息。大量工作 - 非常感謝! –