匹配多行文本(从1行到n行),直到某个新行正则表达式



我创建了正则表达式来匹配这样的模式:

<some text>
yyyy.MM.dd SOME TEXT decimal decimal
yyy.MM.dd
some sentence
some sentence
some sentence (it can have from 1 to n lines of comments) but  the last line that does not start with yyyy.MM.dd SOME TEXT decimal decimal)
yyyy.MM.dd SOME TEXT decimal decimal
yyy.MM.dd
some sentence
some sentence
some sentence
...
<some text>

正则表达式:

((d{4}.d{2}.d{2})s([a-zA-Zs]{0,})s(-{0,1}((d{1},d{2})|(d{1,} d{3},d{2})))s(-{0,1}((d{1},d{2})|(d{1,} d{3},d{2}))s)(d{4}.d{2}.d{2}))

只匹配前2行。在下一个yyyy.MM.dd SOME TEXT decimal decimal(独占(之前,我无法匹配多行语句

这是用于匹配的测试数据:

2020.11.01 SOME TEXT -17,30 83 016,86
2020.10.30
Some text that should be
matched 20.01.2020 as
multiline text
until now
2020.11.01 SOME TEXT -27,30 81 016,86
2020.10.30
Some text that should be
matched 20.01.2020 as
multiline text
until now
...

它应该这样匹配:

1.

2020.11.01 SOME TEXT -17,30 83 016,86
2020.10.30
Some text that should be
matched 20.01.2020 as
multiline text
until now
2020.11.01 SOME TEXT -27,30 81 016,86
2020.10.30
Some text that should be
matched 20.01.2020 as
multiline text
until now

对我来说,它是这样匹配的:

1.

2020.11.01 SOME TEXT -17,30 83 016,86
2020.10.30
2020.11.01 SOME TEXT -27,30 81 016,86
2020.10.30

如果下一行没有"yyyy.MM.dd SOME TEXT decimal decimal",我如何匹配1到多行?

对于示例数据,您可以将前2行匹配为类似日期的模式,然后匹配所有不以类似日期模式开头的行。

请注意d{4}.d{2}.d{2}不会验证日期本身。为了获得更精确的匹配,本页提供了更详细的示例。

^d{4}.d{2}.d{2} .*r?nd{4}.d{2}.d{2}b.*(?:r?n(?!d{4}.d{2}.d{2}b).*)*

Regex演示

或者,如果你首先想匹配所有以日期样模式开头的行(如果是1或更多(,然后匹配不匹配的行:

^d{4}.d{2}.d{2} S.*(?:r?nd{4}.d{2}.d{2}b.*)+(?:r?n(?!d{4}.d{2}.d{2}b).*)*

解释

  • ^字符串的开始
  • d{4}.d{2}.d{2} S.*匹配一个类似日期的模式,后面跟着一个空格,至少是一个非空白字符(对于本例中的SOME TEXT(和行的其余部分
  • (?:r?nd{4}.d{2}.d{2}b.*)+重复1次以上匹配以类似日期模式开头的行
  • (?:非捕获组(作为一个整体重复(
    • r?n匹配换行符
    • (?!d{4}.d{2}.d{2}b)不直接向右断言类似日期的格式
    • .*如果上一个断言为真,则匹配整行
  • )*(可选(重复所有不以日期模式开头的行(如果应该至少有一行,请将量词更改为+(

Regex演示

最新更新