C#Regex——在两个相同的单词及其子行之间进行多次匹配

本文关键字:之间 两个 C#Regex 单词 | 更新日期: 2023-09-27 18:30:00

我有这样的文本:

 INIT -- FOO
   UP: 1
     UpLine #1
   DOWN: 2
     DownLine #1
     DownLine #2
  INIT -- BAR
   UP: 0
   DOWN: 2
     DownLine #1
     DownLine #2

我想基本上捕捉信息,比如INIT-BAR,我有1个向上,2个向下,以及它们的内容。。。然后INIT-FOO也是如此。。。

我就是不知道该怎么做。。。INIT是一个常数,FOO和BAR是变化的变量。

C#Regex——在两个相同的单词及其子行之间进行多次匹配

这里有一个正则表达式,它使用命名的捕获组来跟踪所有不同的片段:

INIT's*--'s*(?<label>'w+)'n
's+UP:'s*(?<up>'d+)'n
(?<uplines>(?:'s+(?!'s*DOWN).*'n)*)
's+DOWN:'s*(?<down>'d+)'n
(?<downlines>(?:'s+(?!'s*INIT).*'n)*)

我知道它有点乱,但它有效!

INIT's*--'s*(?<label>'w+)'n匹配INIT行并捕获"标签"组

's+UP:'s*(?<up>'d+)'n与组中的上行线和"上行"号码相匹配

(?<uplines>(?:'s+(?!'s*DOWN).*'n)*)在下行线路之前获得任何"上行链路"

's+DOWN:'s*(?<down>'d+)'n与下行线和组中的"下行"编号相匹配

(?<downlines>(?:'s+(?!'s*INIT).*'n)*)在下一个INIT 之前获得任何"下线"

在regex101上试用。

备注

  • 我在regex101上使用了"extended"标志,使其更易于阅读。C#支持"IgnorePatternWhilespace"选项,但要在C#中使用它,请将所有行包装在一起
  • 您的环境可能有不同的换行符。很可能是'r'n而不是n