你好,我是regex的新手,有一个小问题,也许很简单。
我有给定的文本:
17.11.2020 15:32 typical Pat. seems sleeping
Additional test
17.11.2020 15:32 typical Pat. seems sleeping
Additional test
17.11.2020 15:32 typical Pat. seems sleeping
Additional test
我当前的正则表达式(d{2}.d{2}.d{4}sd{2}:d{2})s?(.*)
只匹配到睡觉,但正确创建3个匹配。但我也需要第二组中的Additional test
文本。我尝试过类似(d{2}.d{2}.d{4}sd{2}:d{2})s?([,.:ws]*)
的比赛,但现在我只有一场精彩的比赛,因为第二组的比赛一直到最后。
我如何匹配所有内容,直到有日期的新行开始,然后再创建一个新的匹配?
如果您确定只有一个额外的行需要匹配,则可以使用
(?m)^(d{2}.d{2}.d{4}sd{2}:d{2})s*(.*(?:n.*)?)
请参阅regex演示。详细信息:
(?m)
-一个多行修饰符^
—线路起点(d{2}.d{2}.d{4}sd{2}:d{2})
-组1:日期时间字符串s*
-零个或多个空白(.*(?:n.*)?)
-第2组:除了换行符之外的任何零个或多个字符尽可能多,然后是一个可选行,换行符后面跟着除了换行符以外的任何零和多个字符,尽可能多
如果可以有任何数量的行,您可以考虑
(?m)^(d{2}.d{2}.d{4}[p{Zs}t]d{2}:d{2})[p{Zs}t]*(?s)(.*?)(?=nd{2}.d{2}.d{4}|z)
请参阅此regex演示。这里,
(?m)^(d{2}.d{2}.d{4}[p{Zs}t]d{2}:d{2})
-与上面相同,只是s
被替换为仅与水平空白匹配的[p{Zs}t]
[p{Zs}t]*
-0+水平空白字符(?s)
-现在,.
将匹配包括换行符在内的任何字符(.*?)
-第2组:任何零个或多个字符,尽可能少(?=nd{2}.d{2}.d{4}|z)
-最左边出现一个换行符,后面跟着一个日期字符串,或者最后面是字符串的末尾
您正在重复使用s
,使用带有字符类[,.:ws]*
和s
的*
量词也会匹配换行符,并且匹配过多。
您可以使用(.*r?n.*)
匹配该行的其余部分,这将与换行符不匹配,然后匹配换行符和同一组中的下一行。
^(d{2}.d{2}.d{4}sd{2}:d{2})s?(.*r?n.*)
Regex演示
如果后面可以有多行,请匹配后面所有不以类似日期的模式开头的行。
^(d{2}.d{2}.d{4})s*(.*(?:r?n(?!d{2}.d{2}.d{4}).*)*)
解释
^
字符串的开始(
捕获组1d{2}.d{2}.d{4}
匹配类似日期的模式)
关闭第1组s*
匹配0+个空白字符(或匹配没有换行符的空白字符[^Srn]*
((
捕获组2.*
全线匹配(?:r?n(?!d{2}.d{2}.d{4}).*)*
如果不是以类似日期的模式开始,则可选择重复匹配整行
)
关闭组2
Regex演示