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

本文关键字:元素 表达式 正则表达式 | 更新日期: 2023-09-27 18:32:40

当缺少"test2"元素时,如何使"test2"成为以下 C# 正则表达式中的可选元素,从而正确解析"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 评论文本长度允许的长:


谢谢。在您的第二个回复中提议的正则表达式会产生以下输出:

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

这不太正确。您的第一个回复正则表达式的结果

 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 =

在这种情况下。

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

限定整个test2组是可选的:

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

来自 MSDN - 正则表达式语言 - 快速参考:

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

要成为可选的元素后添加一个 ?

.|'s可以用.替换,因为.也与空格匹配

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

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