什么是用于删除换行符的跨平台正则表达式?

时间:2010-07-10 11:36:12

标签: regex text parsing newline

我确信此前已被问到,但我找不到它。

基本上,假设您正在解析未知来源的文本文件并想要用其他分隔符替换换行符,这是最好的正则表达式,还是还有另一个?

(\r\n)|(\n)|(\r)

5 个答案:

答案 0 :(得分:38)

弗莱彻 - 这确实被问过一次。

在这里:Regular Expression to match cross platform newline characters

  • 剧透警报!
  

我想要的正则表达式   精确的是“\ r \ n?| \ n”。

答案 1 :(得分:20)

检查您的正则表达式引擎是否支持\R作为速记字符类,您不需要关注各种Unicode换行符/换行组合。如果实现正确,您可以使用\R透明地匹配所有各种ascii或Unicode行结尾。

在Unicode中,您需要检测NEL(OS / 390行结尾,\ x85)LS(行分隔符,\ x2028)和PS(段落分隔符,\ x2029)这些天你想要完全跨平台。

LS,NEL和PS是否应被视为换行符,行结尾或空格是有争议的。 XML 1.0标准,例如,does not recognize NEL作为换行符。 ECMAScript将LSPS视为换行符,将NEL视为空格。 Perl unicode正则表达式会将VTFFCRCRLFNELLSPS视为换行符为^$正则表达式元字符的目的。

Unicode Implementation Guide(第5.8节和表5.3)可能是对“换行符”的最终处理方式的最佳选择。

如果您只关心使用DOS / Windows / Unix / Mac经典变体的ascii,那么相当于\R的正则表达式为(?>\r\n|[\r\n])

在Unicode中,与\R相当的是(?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029) \x0b中有一个垂直制表符;再一次,这可能适合或不适合您对换行符的定义,但这确实符合Unicode植入的建议。 (FF\x0C未包含在正则表达式中,因为换页符是新页面,而不是定义中的新行。)

答案 2 :(得分:2)

找到任何Unicode行终止符的正则表达式应该是 (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])而是 比drewk写的那样,至少在Perl中。直接取自perl 5.10.0文档(在以后的版本中删除了它)。 请注意\x之后的大括号:U + 2029是\x{2029}\x2029是ASCII空格(U + 0020)+数字2 + a 数字9. \n在字符类之外,也不保证与\x{0a}匹配。

答案 3 :(得分:1)

如果您的平台不支持上面@dawg建议的\R类,如果您的平台支持负lookaround或字符类减法,您仍然可以制作一个非常优雅且强大的解决方案(例如,Java类减法是通过syntax [x&&[^y]])。

在大多数常规表达式语法中,点字符被定义为“除换行符之外的任何字符”(例如,参见JavaScript,here)。如果您匹配具有以下特征的内容:

  1. not(除换行符之外的任何字符)→换行符;和
  2. 是空白
  3. 由于我目前正在使用JavaScript,AFAIK没有\R简写字符类减法,我仍然可以使用负向前瞻来获得我想要的东西。以下正则表达式匹配所有换行符:

    /((?!.)\s)+/g
    

    以下JavaScript代码,至少在Windows 7上的Chrome 42.0.2311.90m中运行时,消除了JavaScript(即@ dawg第三段中提到的“ECMAScript”)识别的所有类型的换行符:

    var input = "hello\r\n\f\v\u2028\u2029 world";
    var output = input.replace(/((?!.)\s)+/g, "");
    document.write(output); // hello world

答案 4 :(得分:0)

只需将/[\r\n]+/g替换为空字符串""

无论它们出现在字符串中的顺序如何,它都将替换所有\r\n