使用正则表达式匹配双线换行符

时间:2012-10-25 09:26:04

标签: regex edifact

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

我使用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]

    描述:表示与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

3 个答案:

答案 0 :(得分:5)

在角色类中,无论你多久写一次,每个角色都算一次。因此,不能使用字符类来检查连续的换行符。但你可以使用先行断言:

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

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

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

答案 1 :(得分:0)

尝试

    [\r\n]{2,}

“匹配双换行符”

在DWR中用于删除双行/双行换行符(由于某些原因,未在解压缩文件中保留)

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

答案 2 :(得分:0)

这个简单,最适合我:

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