2

我需要编写正则表达式,以特殊符号捕获类型名称的通用参数(也可以是通用的),如下所示:

System.Action[Int32,Dictionary[Int32,Int32],Int32]

让我们假设类型名称是[\w.]+,参数是[\w.,\[\]]+ ,所以我只需要抓取Int32Dictionary[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
)$

演示

UPD2(最后一次优化)

^[\w.]+
\[(?<delim>)
[\w.]+
(?:
 (?:(?(open)|(?<param-delim>)),(?(open)|(?<delim>))[\w.]+)?
 (?:(?<open>\[)[\w.]+)?
 (?:(?<-open>\]))*
)*
(?(open)|(?<param-delim>))\]
(?(open)(?!)
)$
4

1 回答 1

2

我建议使用捕获这些值

\w+(?:\.\w+)*\[(?:,?(?<res>\w+(?:\[[^][]*])?))*

请参阅正则表达式演示

细节:

  • \w+(?:\.\w+)*- 匹配 1+ 单词字符后跟.+ 1+ 单词字符 1 次或更多次
  • \[- 文字[
  • (?:,?(?<res>\w+(?:\[[^][]*])?))*- 0 个或多个序列:
    • ,?- 可选逗号
    • (?<res>\w+(?:\[[^][]*])?)- 组“res”捕获:
      • \w+- 一个或多个单词字符(也许,你想要[\w.]+
      • (?:\[[^][]*])?- 1 个或 0 个(更改?*匹配 1 个或多个)序列 a [、除[and之外的 0+ 个字符]和一个结束符]

下面的C# 演示

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

查看正则表达式演示

于 2016-08-02T12:55:05.543 回答