用于在两个正则表达式之间匹配文本的正则表达式

时间:2018-03-29 23:08:28

标签: regex regex-negation regex-lookarounds regex-group

我正在寻找一种从文本文档中捕获文本及其段落标题的方法。

文字档案:

paraTitle-1
--------
Lines and words
empty....
more lines



still part of paraTitle-1

paraTitle-2
--------
Lines and words
empty....
more lines



still part of paraTitle-2

我想要捕捉它们下面的标题和文字。

 array = [paraTitle-1: <text...below paraTitle-11>,
          paraTitle-2: <text below paraTitle-2>]

我用模式(?<=(.*))\n----*\n(?=(.*))做了一些尝试但无济于事。任何指导都会很棒。

1 个答案:

答案 0 :(得分:1)

以下正则表达式将会:

(?!--------\R)(.*)\R--------\R((?:\R?(?!.*\R--------\R).*)+)

请参阅regex101

标题分隔线(--------)也可以指定为-{8},如果需要,可以更容易地调整为可变长度,例如而不是正好8个破折号,它可以是6个或更多:-{6,}

说明:

  • 捕获一行文字(段落标题):

    (.*)\R
    
    • .不匹配换行符
    • \R匹配换行符,包括Windows CRLF对。如果您的正则表达式引擎不支持\R,请使用\r?\n作为简单替代方案。
  • 确保捕获的文本不是标题分隔线:

    (?!--------\R)
    
  • 跳过强制标题分隔线:

    --------\R
    
  • 捕获段落文本,作为重复的行组:

    ((?:xxx)+)
    
  • 一行有一个可选的前导换行符(第一行没有一行):

    \R?.*
    
  • 但请确保该行不是下一段的标题,即它不是一行后跟标题分隔线。

    (?!.*\R--------\R)