带有多个圆括号的子字符串的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不是解决这个问题的正确方法,用编程方法解决这个问题会更容易。在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;
}