【问题标题】:Regex match from start label until empty line or end label从开始标签到空行或结束标签的正则表达式匹配
【发布时间】:2015-09-21 22:44:49
【问题描述】:

如何使用正则表达式匹配开始标签和空行或结束标签之间的内容?

例如regex101 link:

<START> some text is here. 
more text

unrelated text

<START> even more text. 
text text
<STOP>

它应该匹配两个匹配项

<START> some text is here. 
more text

<START> even more text. 
text text
<STOP>

到目前为止我提出的正则表达式如下(但它匹配整个文本,我假设是因为 (?s).* 部分)。

<START>((?s).*)(\s\s|<STOP>)

【问题讨论】:

    标签: regex


    【解决方案1】:

    您应该为.* 使用lazy quantifier 以尽可能少地匹配。使用.*?

    (?s)(<START>.*?)(?:(?:\r*\n){2}|<STOP>)
    

    将您指定为结束条件的内容排除在组之外。

    1. (?:\r*\n){2} 一个空行。
    2. &lt;STOP&gt; 结束标签。

    DEMO

    【讨论】:

    • 这对我来说太神秘了,但非常感谢你分享它,因为它救了我的培根!
    【解决方案2】:

    您可以这样设计您的模式(使用修饰符 m):

    <START>[^\n<]*(?:(?:<(?!STOP>)|\n(?!$))[^\n<]*)*(?:<STOP>|\n$|\z)
    

    demo

    这个想法是匹配所有不是&lt; 或换行符与[^\n&lt;]*。当到达&lt; 或换行符时,负前瞻检查是否没有跟在"STOP&gt;" 或行尾。如果负前瞻成功,则[^\n&lt;]*(这次在非捕获组中)到达下一个&lt; 或换行符。该组重复直到&lt;STOP&gt;,两个换行符,字符串的结尾。

    【讨论】:

      【解决方案3】:

      使用这个模式(?&lt;=&lt;START&gt;).+\n.+

      在此处查看演示 https://regex101.com/r/cU2tX6/2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-10
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 2010-10-09
        • 2019-01-17
        • 1970-01-01
        相关资源
        最近更新 更多