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

时间:2014-11-11 19:37:32

标签: c# .net regex

我有这样的文字:

 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是变化的变量。

1 个答案:

答案 0 :(得分:0)

这是一个使用命名捕获组来跟踪所有不同部分的正则表达式:

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行匹配并捕获&#34;标签&#34;组

\s+UP:\s*(?<up>\d+)\n匹配UP行和&#34; up&#34;组中的数字

(?<uplines>(?:\s+(?!\s*DOWN).*\n)*)获得任何&#34;上线&#34;在DOWN线之前

\s+DOWN:\s*(?<down>\d+)\n匹配DOWN行和&#34; down&#34;组中的数字

(?<downlines>(?:\s+(?!\s*INIT).*\n)*)获得任何&#34;下线&#34;在下一个INIT之前

regex101上试用。

备注

  • 我使用&#34;扩展&#34;在regex101上标记以使其更易于阅读。 C#支持该选项作为&#34; IgnorePatternWhitespace&#34;,但要在C#中使用它,将所有行包装在一起。
  • 您的环境可能有不同的换行符。最有可能是\r\n而不是n