Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带平衡群的正则表达式_C#_.net_Regex_Balancing Groups - Fatal编程技术网

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)(?!))])?))*