gpt4 book ai didi

c# - 带平衡组的正则表达式

转载 作者:行者123 更新时间:2023-11-30 23:22:35 25 4
gpt4 key购买 nike

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

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
)$

Demo

UPD2(上次优化)

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

最佳答案

我建议捕获这些值使用

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

参见 regex demo .

详细信息:

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

A C# demo below :

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

参见 regex demo

关于c# - 带平衡组的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38720537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com