C#RegEx匹配表达式中的可选元素

时间:2012-04-27 13:57:38

标签: c# regex

如何使'test2'成为以下C#RegEx表达式中的可选元素,当'test2'元素丢失时,正确解析'test1'值?

 StringBuilder sb = new StringBuilder();
 sb.AppendLine("    test1=123 any text in between  ");
 sb.AppendLine(" some ");
 sb.AppendLine(" more ");
 sb.AppendLine(" text in between ");
 sb.AppendLine("    test2=456   ");
 sb.AppendLine("    test1=789  some text .. test2=012   ");

 Regex regex = new Regex(@"test1=(?<test1>(\d+))((.|\s)+?)(test2=(?<test2>(\d+)))");

 MatchCollection matches = regex.Matches(sb.ToString());
 foreach (Match match in matches)
 {
     Group test1 = match.Groups["test1"];
     Group test2 = match.Groups["test2"];                
     System.Console.WriteLine("Test1 = {0}, Test2 = {1}", test1.Value, test2.Value);
 }

谢谢。


@Oded - 我在这里回复,因为我无法正确格式化评论,因为我的回复比StackOverflow评论文本长度允许的时间更长:


谢谢。在您的第二个回复中建议RegEx表达式产生以下输出:

 Test1 = 123, Test2 = 
 Test1 = 789, Test2 =

这不太正确。 并且您的第一个回复RegEx表达式会导致

 Test1 = 123, Test2 = 456
 Test1 = 789, Test2 = 012

测试输出。那是对的。

但如果我改变

sb.AppendLine("    test1=789  some text .. test2=012   ");

sb.AppendLine("    test1=789  some text .. test52=012   ");

然后测试结果输出只有一行

Test1 = 123, Test2 = 456

我希望它是

 Test1 = 123, Test2 = 456
 Test1 = 789, Test2 =

在那种情况下。

2 个答案:

答案 0 :(得分:5)

确保整个test2群组是可选的:

@"test1=(?<test1>(\d+))((.|\s)+?)(test2=(?<test2>(\d+)))?"

来自MSDN - Regular Expression Language - Quick Reference

  

? -   匹配前一个元素零次或一次。

答案 1 :(得分:1)

添加?在您希望成为可选元素之后

.|\s可以替换为.,因为.也匹配空格

要匹配换行符,您还必须传递单行选项Regex regex = new Regex(@"test1=(?<test1>(\d+))((.)+?)(test2=(?<test2>(\d+)))?",RegexOptions.Singleline);

(Oded的解决方案是完成所有这些)