C# 带平衡群的正则表达式
我需要编写正则表达式,以特殊符号捕获类型名称的泛型参数(也可以是泛型),如下所示:C# 带平衡群的正则表达式,c#,.net,regex,balancing-groups,C#,.net,Regex,Balancing Groups,我需要编写正则表达式,以特殊符号捕获类型名称的泛型参数(也可以是泛型),如下所示: System.Action[Int32,Dictionary[Int32,Int32],Int32] 让我们假设类型名称是[\w.]+,参数是[\w,\[\]]+ 所以我只需要抓取Int32,字典[Int32,Int32]和Int32 基本上,如果平衡组堆栈是空的,我需要采取一些措施,但我真的不明白怎么做 UPD 下面的答案帮助我快速解决了问题(但没有适当的验证,深度限制=1),但我通过团队平衡成功解决了问题:
System.Action[Int32,Dictionary[Int32,Int32],Int32]
让我们假设类型名称是[\w.]+
,参数是[\w,\[\]]+
所以我只需要抓取Int32
,字典[Int32,Int32]
和Int32
基本上,如果平衡组堆栈是空的,我需要采取一些措施,但我真的不明白怎么做
UPD
下面的答案帮助我快速解决了问题(但没有适当的验证,深度限制=1),但我通过团队平衡成功解决了问题:
^[\w.]+ #Type name
\[(?<delim>) #Opening bracet and first delimiter
[\w.]+ #Minimal content
(
[\w.]+
((?(open)|(?<param-delim>)),(?(open)|(?<delim>)))* #Cutting param if balanced before comma and placing delimiter
((?<open>\[))* #Counting [
((?<-open>\]))* #Counting ]
)*
(?(open)|(?<param-delim>))\] #Cutting last param if balanced
(?(open)(?!) #Checking balance
)$
^[\w.]+#类型名称
\[(?)#开始括号和第一个分隔符
[\w.]+#最小内容
(
[\w.]+
((?(打开)|(?),(?(打开)|(?))*#如果在逗号之前平衡切割参数并放置分隔符
(?\[)*#计数[
((?\])*#计数]
)*
(?(打开)|(?)\]#如果平衡,切割最后一个参数
检查余额
)$
UPD2(上次优化)
^[\w.]+
\[(?)
[\w.]+
(?:
(?:(?(开放)|(?),(?(开放)|(?)[\w.]+)?
(?:(?\[)[\w.]+)?
(?:(?\]))*
)*
(?(开放)|(?)\]
(?(打开)(?!)
)$
我建议使用
\w+(?:\.\w+)*\[(?:,?(?<res>\w+(?:\[[^][]*])?))*
更新:要解释未知深度[…]
子字符串,请使用
\w+(?:\.\w+)*\[(?:\s*,?\s*(?<res>\w+(?:\[(?>[^][]+|(?<o>\[)|(?<-o>]))*(?(o)(?!))])?))*
\w+(?:\。\w+*\[(?:\s*,?\s*(?\w+(?:\[(?>[^]])++(?\[)(?)*(?(o)(?!)))))*
请参阅Try.
${res}
捕获将包含值。如果您有一个嵌套级别的[…]
,则此处不需要任何平衡组。我甚至不确定您是否需要\w+(?:\。\w+)*
您的解决方案今天对我很有帮助,我可以立即继续前进,但后来我通过平衡小组解决了这个问题。更新问题中的解决方案。您实际上可以使用我的正则表达式的一个mod:。您的[\w.]
匹配以
开头的子字符串,这是错误的,因为标识符以[a-zA-Z]开头
var line = "System.Action[Int32,Dictionary[Int32,Int32],Int32]";
var pattern = @"\w+(?:\.\w+)*\[(?:,?(?<res>\w+(?:\[[^][]*])?))*";
var result = Regex.Matches(line, pattern)
.Cast<Match>()
.SelectMany(x => x.Groups["res"].Captures.Cast<Capture>()
.Select(t => t.Value))
.ToList();
foreach (var s in result) // DEMO
Console.WriteLine(s);
\w+(?:\.\w+)*\[(?:\s*,?\s*(?<res>\w+(?:\[(?>[^][]+|(?<o>\[)|(?<-o>]))*(?(o)(?!))])?))*