【问题标题】:What is a cross platform regex for removal of line breaks?什么是用于删除换行符的跨平台正则表达式?
【发布时间】:2011-03-14 05:42:59
【问题描述】:

我确定以前有人问过这个问题,但我找不到。

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

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

【问题讨论】:

标签: regex text parsing newline


【解决方案1】:

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

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

【讨论】:

  • 这将用一个替换标记替换任意数量的换行符。
  • @Andreas 他想删除换行符。
【解决方案2】:

Fletcher - 之前确实有人问过这个问题。

给你:Regular Expression to match cross platform newline characters

  • 剧透警告!

我想成为时使用的正则表达式 精确的是 "\r\n?|\n"。

【讨论】:

    【解决方案3】:

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

    在 Unicode 中,如果您想完全交叉,则需要检测 NEL(OS/390 行尾,\x85)LS(行分隔符,\x2028)和PS(段落分隔符,\x2029)这几天的平台。

    LS、NEL 和 PS 是否应该被视为换行符、换行符或空白是有争议的。 XML 1.0 标准,例如,does not recognizeNEL 作为换行符。 ECMAScript 将 LSPS 视为换行符,但将 NEL 视为空格。 Perl unicode 正则表达式将 VTFFCRCRLFNELLSPS 视为换行符,用于 ^ 和 @987654 reg 元.

    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 Implantation 的建议。 (FF\x0C 不包含在正则表达式中,因为 Form Feed 是一个新页面,而不是定义中的新行。)

    【讨论】:

    • "utf8" 在您的答案中应该是“Unicode”。 UTF-8 只是 Unicode 字符编码之一。
    • 你是对的,但我所指的文档(PCRE 手册)也有同样的问题!编辑完成...
    • 在Java中,\x2028|\x2029部分必须写成\u2028|\u2029,因为\xhh只用于2位十六进制字符值,而\uhhhh用于4位十六进制字符值。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果您的平台不支持上面@dawg 建议的\R 类,如果您的平台支持负lookaround 或字符类减法(例如在Java类减法是通过syntax[x&&[^y]])。

      在大多数正则表达式语法中,点字符被定义为“除换行符之外的任何字符”(例如,对于 JavaScript,请参见 here)。如果你符合以下特征:

      1. not(除换行符以外的任何字符)→ 换行符;和
      2. 是空格

      由于我目前正在使用 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

      【讨论】:

        猜你喜欢
        • 2010-11-22
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多