2013-02-18 68 views
0

我試圖根據設置更改字符串的行尾。基本上我有Strings,主要是LF結尾,很少有其他的東西,但是它發生了,我希望能夠改變他們到CRLF或CR如果問,或確保他們純粹是LF,如果這是問。源和目標平臺因操作系統而異,所以我想根據需要更改行結尾。根據設置在字符串中更改EOL

目前我使用此代碼做

if(this.eolCharacter.equalsIgnoreCase("CR")){ 
      //replaces all \r\n with \r 
      //replaces all \n that are not preceded by \r with \r 
      return input.replaceAll("\\r\\n", "\r").replaceAll("\\n", "\r"); 
    }else if(this.eolCharacter.equalsIgnoreCase("LF")){ 
      //replaces all \r\n with \n 
      //replaces all \r with \n 
      return input.replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n"); 
    }else{ 
      //replaces all \n that are not preceded by \r 
      //replaces all \r that are not followed by \n 
      return input.replaceAll("(?<!\\r)\\n", "\r\n").replaceAll("\\r(?!\\n)", "\r\n");} 

我有點擔心,這段代碼可能是脆弱的還是我錯過了在正則表達式的東西,所以我想知道是否有可能一個原生的方式來做到這一點,它是Java 6,如果可能有幫助,我們使用Apache StringUtils。

感謝您的任何意見!

+1

爲什麼?各種'readLine()'方法都可以正確處理所有已知的變體,如果你真的需要它,當前行結束符可以通過系統屬性獲得。整個想法是不在乎。 – EJP 2013-02-18 09:29:44

+0

問題是字符串被寫入到文本文件中,然後在一些低級程序中需要這些文本文件,這些文件有時無法應付這些問題,而且過去我們遇到了問題。 – Markus 2013-02-18 09:48:09

回答

2

看起來像它會工作,但作爲EJP提到的,你不應該需要做它,它可以如下簡化:

if(this.eolCharacter.equalsIgnoreCase("CR")){ 
    return input.replaceAll("(\\r)?\\n", "\r"); 
}else if(this.eolCharacter.equalsIgnoreCase("LF")){ 
    return input.replaceAll("\\r(\\n)?", "\n"); 
}else{ 
    return input.replaceAll("((\\r)?\\n)|(\\r(?!\\n))", "\r\n"); 
}