【问题标题】:Regex start new match at specific pattern正则表达式以特定模式开始新匹配
【发布时间】:2020-12-14 22:04:18
【问题描述】:

你好,我对正则表达式有点陌生,有一个小问题,也许很简单。

我有给定的文字:

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}\s\d{2}:\d{2})\s?(.*) 只匹配到睡觉,但正确匹配 3 个匹配项。 但我也需要第二组中的Additional test 文本。 我尝试了(\d{2}.\d{2}.\d{4}\s\d{2}:\d{2})\s?([,.:\w\s]*) 之类的方法,但现在我只有一场巨大的比赛,因为第二组将所有东西都拿走了。

我怎样才能匹配所有内容,直到一个带有日期的新行开始并从那里创建一个新匹配?

【问题讨论】:

  • 试试(?m)^(\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2})[\p{Zs}\t]*(.*)\r?\n(.*),见demo。或者,(?m)^(\d{2}\.\d{2}\.\d{4}[\p{Zs}\t]\d{2}:\d{2})[\p{Zs}\t]*(.*)\r?\n(?s)(.*?)(?=\n\d{2}\.\d{2}\.\d{4}|\z)
  • 你在一个字符类中重复使用\s,它也匹配换行符并且会匹配太多。您可以只取出\s 并匹配该行的其余部分并匹配一个换行符。 (\d{2}.\d{2}.\d{4}\s\d{2}:\d{2})\s?(.*\r?\n.*)regex101.com/r/LjvLh0/1
  • ^(\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2})\s*(.*\ r?\n?.*) 工作过@WiktorStribiżew。我使用并改变了你的,因为我不明白一些东西但仍然有效!

标签: c# regex


【解决方案1】:

如果您确定只有一行要匹配,您可以使用

(?m)^(\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2})\s*(.*(?:\n.*)?)

请参阅regex demo。详情:

  • (?m) - 多行修饰符
  • ^ - 行首
  • (\d{2}\.\d{2}\.\d{4}\s\d{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)(.*?)(?=\n\d{2}\.\d{2}\.\d{4}|\z)

this regex demo。这里,

  • (?m)^(\d{2}\.\d{2}\.\d{4}[\p{Zs}\t]\d{2}:\d{2}) - 与上面相同,只是将\s 替换为仅匹配水平空格的[\p{Zs}\t]
  • [\p{Zs}\t]* - 0+ 个水平空白字符
  • (?s) - 现在,. 将匹配任何字符,包括换行符
  • (.*?) - 第 2 组:任意零个或多个字符,尽可能少
  • (?=\n\d{2}\.\d{2}\.\d{4}|\z) - 直到最左边出现的换行符,后跟日期字符串,或者直到字符串的结尾。

【讨论】:

    【解决方案2】:

    您正在使用 \s 反复使用带有字符类 [,.:\w\s]*\s* 量词也匹配换行符,并且会匹配太多。

    您可以使用(.*\r?\n.*) 匹配行的其余部分,它不会匹配换行符,然后匹配换行符和同一组中的下一行。

    ^(\d{2}.\d{2}.\d{4}\s\d{2}:\d{2})\s?(.*\r?\n.*)
    

    Regex demo

    如果后面可以有多行,则匹配后面所有不以类似日期的模式开头的行。

    ^(\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+ 个空白字符(或匹配不带换行符的空白字符 [^\S\r\n]*
    • ( 捕获第 2 组
      • .*整行匹配
      • (?:\r?\n(?!\d{2}\.\d{2}\.\d{4}).*)* 如果整行不是以类似模式的日期开头,则可选择重复匹配整行
    • )关闭第二组

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      相关资源
      最近更新 更多