Regex以特定模式开始新的比赛

  • 本文关键字:开始 模式 Regex c# regex
  • 更新时间 :
  • 英文 :


你好,我是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}).*)*)

解释

  • ^字符串的开始
  • (捕获组1
  • d{2}.d{2}.d{4}匹配类似日期的模式
  • )关闭第1组
  • s*匹配0+个空白字符(或匹配没有换行符的空白字符[^Srn]*(
  • (捕获组2
    • .*全线匹配
    • (?:r?n(?!d{2}.d{2}.d{4}).*)*如果不是以类似日期的模式开始,则可选择重复匹配整行
  • )关闭组2

Regex演示

最新更新