【问题标题】:Matching double line breaks using Regex使用正则表达式匹配双换行符
【发布时间】:2012-10-15 10:54:23
【问题描述】:

我正在编写一个正则表达式,它将从 EDIFACT UN 代码列表中提取各种信息。由于有数以万计的代码,我不想全部输入,所以我决定使用正则表达式来解析文本文件并提取出我需要的位。文本文件的结构使我可以轻松识别所需的位。

我使用Regex Hero 创建了以下正则表达式来测试它,但我无法让它匹配所有内容,直到 codeComment 组的双换行符。我试过使用字符类 [^\n\n] 但这仍然不匹配双换行符。

注意:我在 Regex Hero 上选择了多行选项。

(?<element>\d+)\s\s(?<elementName>.*)\[[B|C|I]\]\s+Desc: (?<desc>[^\n]*\s*[^\n]*)
^\s*Repr: (?<type>a(?:n)?)..(?<length>\d+)
^\s*(?<code>\d+)\s*(?<codeName>[^\n]*)
^\s{14}(?<codeComment>[^\n]*)

这是我用来匹配的示例文本。

----------------------------------- ----------------------

  • 1073 文档行动作代码[B]

    Desc: 指示与 a 行相关联的操作的代码
        文档。

    Repr: an..3

    1 包含在文件/交易中
        文档行包含在
        文件/交易。
        也应该捕捉到这一点。

    2 从文档/交易中排除
        文档行被排除在
        文件/交易。

我想要的是 codeComment 包含以下内容:

The document line is included in the
          document/transaction.
          should capture this as well.

但它只是提取第一行:

The document line is included in the

【问题讨论】:

    标签: regex edifact


    【解决方案1】:

    在一个字符类中,每个字符都算一次,无论您多久编写一次。所以一个字符类不能用于检查连续的换行符。但是您可以使用前瞻断言:

    ^\s{14}(?<codeComment>(?s)(?:(?!\n\n).)*)
    

    (?s) 开启单行模式(以允许点匹配换行符)。

    (?!\n\n) 断言当前位置没有两个连续的换行符。

    【讨论】:

    • 您的答案是正确的,但我无法让修改后的正则表达式获取“2 从文档/交易中排除该文档行已从文档/交易中排除”。线条也是如此。
    • @MikeClarke:但是那些是在双换行符之后出现的,所以我认为你想接他们?如果你这样做,正确的分隔符是什么?
    • 就像我说的,您的答案正确地拾取了代码 1 的所有注释行,但我还需要它来拾取其他代码块。修改后的正则表达式仅在代码 1 处停止,并且不会继续获取更多代码。
    • 好的,但是如果它不应该在双换行符处停止(这是你在问题中写的),那么它应该在哪里停止?
    • 你误会我了。修改后的正则表达式现在正确地拾取注释的所有行,但仅适用于代码 1。由于某种原因,整个正则表达式没有正确地继续拾取代码 2,它是 cmets 等。我认为这是因为代码 1 遵循 'Repr: ' 并且代码 2 遵循代码 1 等,所以我可能需要更改正则表达式以允许这样做。
    【解决方案2】:

    试试

        [\r\n]{2,}
    

    “匹配双换行符”

    在 DWR 中用于删除双重/臃肿的换行符(由于某种原因从解压缩文件中遗留下来的)

    更多信息: How to remove unwanted "extra line breaks" that appear in PHP/CSS/JS files after unzip?

    【讨论】:

      【解决方案3】:

      这个很简单,最适合我:

      /[\r]?\n[\r]?\n/g
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多