如何使用C#Regex匹配文本块

时间:2012-10-21 16:25:20

标签: c# .net regex

我有一个文本文件,其中有数百行符合此模式:

[Part 1.SubPart 2.A 1]
Variable=value
(...)
LastVariable1=value
[Part 1.SubPart 2.B 2]
Variable=value
(...)
LastVariable2=value
[Part 1.SubPart 2.C 3]
Variable=value
(...)
LastVariable3=value
[Part 1.SubPart 3.A 1]
(...)

我需要提取以 [Part ... A *] 开头的每个块,并在下一个“A”块开始之前结束。

最后一个变量“LastVariable3”在所有部分中都有一个常量名称,可以为我的目的忽略。

我尝试过根据其他帖子使用以下表达式,但它们无效。

var pattern = new Regex(@"\[Part.*A..\])(.*)(^LastVariable3)",RegexOptions.Singleline);

var pattern = new Regex(@"\[Part.*A..\])(.|\n)*(^LastVariable3)",RegexOptions.Singleline);

...它们总是一次匹配WHOLE文件中的所有Part块而不是一次匹配。

我也试过(\[Part.*A..\]\n)(.*(\n)){"number of lines"},但变量的数量不是常数,所以这不起作用。

希望这是有道理的!关于我做错了什么的任何想法?我是Regex的新手。

2 个答案:

答案 0 :(得分:1)

使用RegexOptions.Singleline正则表达式

(\[Part\s[^\]]+\s\d+\.A\s\d+\].*?)(?=(?:[\n\r]\[Part\s[^\]]+\s\d+\.A\s\d+\]|\Z))

答案 1 :(得分:0)

你的第二次尝试非常接近。你刚忘了一个额外的paren())。此外,您需要使用RegexOptions.Multiline代替RegexOptions.Singleline

我尝试过这种模式并且有效:

\[Part.*A..\](.|\n)*(^LastVariable3)