【问题标题】:Changing EOL in String based on setting根据设置更改字符串中的 EOL
【发布时间】:2013-02-18 09:12:10
【问题描述】:

我正在尝试根据设置更改字符串的行尾。基本上我有字符串,主要是 LF 结尾,很少有其他东西,但它会发生,如果被问到,我希望能够将它们更改为 CRLF 或 CR,或者如果被问到,请确保它们是纯粹的 LF。源平台和目标平台因操作系统而异,因此我想根据自己的喜好更改行尾。

目前我正在使用此代码进行操作

    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 如果这可能有帮助的话。

感谢您的任何意见!

【问题讨论】:

  • 为什么?各种readLine() 方法都可以正确处理所有已知的变体,如果您确实需要,可以通过系统属性获得当前行终止符。整个想法是不在乎。
  • 问题是字符串被写入文本文件,然后在一些低级程序中需要,这些有时无法处理这些,不幸的是我们过去遇到过问题。

标签: java cross-platform eol


【解决方案1】:

看起来它会起作用,但正如 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");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2021-07-19
    • 2021-12-11
    相关资源
    最近更新 更多