当前位置: 首页 > 知识库问答 >
问题:

带平衡群的正则表达式

申屠英韶
2023-03-14

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

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

共有1个答案

颛孙森
2023-03-14

我建议使用

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

请参阅regex演示。

细节:

  • \w(?:\.\w)*-匹配1个单词字符,后跟 1个单词字符1次或多次
  • \[-文字[
  • (?:,?(?)?

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

查看regex演示

 类似资料:
  • 有谁能让我睡着吗? 我不知道为什么这段代码现在不工作了。 甚至几个小时前它还能工作!! 请让我知道是什么问题。 输入:300+25 预期输出: 300 + 25 + 输出: null null null 通知PLZ

  • 问题内容: 我有一个表,其中存储了某些单词或单词组。我想选择以大写字母开头,没有空格且仅包含字母的条目。我的SQL看起来像这样: 我如何使用条件来做同样的事情? 问题答案: 尝试这个:

  • 我在Java的一次采访中被问到这个问题。我不能解决它,但我猜它可以解决使用正则表达式。不确定是否有一种不使用正则表达式的替代方法。有人能帮我用正则表达式吗?或者,如果不使用正则表达式就能解决这个问题。 给定一个平衡括号字符串(它只包含或,并且它已经平衡),我需要查找它内部是否包含模式(表示一个或多个平衡括号表达式)。也就是说,检查它是否在任何中包含3个或更多的。 示例: 对于,预期答案为true,

  • 问题内容: 我需要从字符串“ بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ”中删除一些Unicode符号 我知道他们肯定在这里。我试过了: 但这不起作用。字符串保持不变。我究竟做错了什么? 问题答案: 您使用的是python 2.x还是3.0? 如果您使用的是2.x,请尝试使用“ u”使正则表达式字符串成为unicode-escape字符串。由于它是正则表达式,因此

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 我有一些具有bg_和cp_前缀数据库表,如“bg_table1”、“bg_table2”和“cp_table1”,还有一些没有任何前缀的表,如my_table1和user_action等等。 我有两个debezium postgreSQL连接器,并尝试通过以下操作配置属性:debezium-http://debezium.io/docs/connectors/postgreSQL/#connect