带有多个圆括号的子字符串的Regex

本文关键字:Regex 字符串 圆括号 | 更新日期: 2023-09-27 18:28:05

尝试在键(值)模式中匹配带有多个圆括号的字符串。

字符串1:

hostportservice(192.168.1.241(10001), service(master))   hostportservice(192.168.1.200(10001), service(slave))

字符串1匹配

hostportservice(192.168.1.241(10001), service(master))
hostportservice(192.168.1.200(10001), service(slave))

字符串2:

hostportservice(192.168.1.241(10001), service(master))   updatedate(24-DEC-2015) updatetime(11:32:57 PM)

字符串2匹配

hostportservice(192.168.1.241(10001), service(master))
updatedate(24-DEC-2015)
updatetime(11:32:57 PM)

带有多个圆括号的子字符串的Regex

我认为RegEx不是解决这个问题的正确方法,用编程方法解决这个问题会更容易。在C#中,这意味着遍历字符串,计算副题,并在每次副题计数为0并且您命中空格时进行拆分。

有点复杂:

([^'s]+'s[^'s]+)'s+([^'s]+)'s+([^'s]+'s[^'s]+)|([^'s]+'s[^'s]+)'s+([^'s]+'s[^'s]+)

此处演示:https://regex101.com/r/jP9uO0/1

您试图实现的是使用.NET Regex中的平衡组。你应该阅读以下链接

  • 平衡组定义
  • 平衡组教程
  • 使用RegEx平衡匹配括号

以下是适用于您的案例的代码。你可能需要使用它来使它适用于你的所有案例。

var pattern = new Regex(
                    @"'s*(?'TXT'(?:" +               /* Let's capture this expression */
                        @"[^()]*" +                  /* Part before parens start */
                        @"(?:(?'OPEN''()[^()]*)+" +  /* Capture open paren followed by any text */
                        @"(?'-OPEN''))+" +           /* Now remove the captured open paren group for every closed paren */
                    @")+?)" +                        /* Finished capture group */
                    @"(?(OPEN)(?!))"                 /* Confirm that no extra open parens are left on the stack */
                    );
var inputString = 
        @"hostportservice(192.168.1.241(10001), service(master))   hostportservice(192.168.1.200(10001), service(slave))" + Environment.NewLine +
        @"hostportservice(192.168.1.241(10001), service(master))   updatedate(24-DEC-2015) updatetime(11:32:57 PM)";
Match match;
int startAt = 0;
while ((match = pattern.Match(inputString, startAt)).Success) {
    Debug.WriteLine("Pattern Matched: " + match.Groups["TXT"].Value);
    startAt = match.Index + match.Length;
}