我创建了正则表达式来匹配这样的模式:
<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演示