這是一個非常瑣碎的事情:替換線相匹配的行尾
- 可能含有尾隨空白
- 由 '\ n', '\ r', '\ r \ n' 或沒有結束
由不包含尾隨空白並以'\ n'結尾的行。
我想我可以通過一個簡單的正則表達式。這裏,"\\s+$"
不起作用,因爲$
匹配在最後的\n
之前。這就是爲什麼有\\z
。至少我想過。但
"\n".replaceAll("\\s*\\z", "\n").length()
回報2.其實,$
,\\z
和\\Z
這裏做同樣的事情。我很困惑...
艾倫·摩爾的解釋是有幫助的,但它現在只是當它發生,我認爲在EOF更換任意最後空白垃圾我能做
replaceFirst("\\s*\\z"", "\n");
而不是replaceAll
。一個簡單的解決方案做上述所有的事情是
replaceAll("(?<!\\s)\\s*\\z|[ \t]*(\r?\n|\r)", "\n");
我很害怕,這是不是非常快,但它是可以接受的。
*實際上,\ z是無關緊要的。* - 它不可能是因爲我真的不想替換中間的空格。 *'$'可以匹配字符串的末尾,也可以匹配字符串末尾的行分隔符。* - 我知道,這就是爲什麼我使用'\ z'來代替,因爲我只想在最後匹配。 – maaartinus
關於'*'...原本我用的是'+',但是我想知道缺失行結尾的情況。我的錯。因此,現在'(s +'\ n')。replaceFirst(「\\ s + \\ z」,「\ n」)似乎可以工作,但對於這樣一項微不足道的任務而言,這很複雜。 – maaartinus
不,我的意思是它在你的例子*中沒有任何作用。只有兩個位置,正則表達式可以開始匹配:在換行之前和之後。但我想我現在得到你;我會更新我的答案。 –