c# - 如何将正则表达式模式放在另一个正则表达式模式中而不会出现不匹配
问题描述
这是我的正则表达式模式(没有空格 atm):
(method)\((.*?),(.*?)\)|(print)\((.*?)\)
结果总是返回:
"method(a,print(hello world)"
代替:
"method(a,print(hello world))"
如何在保留外部括号的同时捕获所有内容?
解决方案
如果需要,这使用称为平衡组的特殊构造来实现递归并在方法中捕获多个嵌套级别。捕获的命令放在“命令”组内
var regex = new Regex(@"method
[(]
(?<action>\w+)\s*,\s*
(\s*
(?<commands>\w+
(;|
((?<open>[(])[^(]*?)+
(?<close-open>[)])+
(?(open)(?!))
))+
\s*)+
[)]", RegexOptions.IgnoreWhitespace | RegexOptions.ExplicitCapture);
这是正则表达式的永久链接。如果您在那里查看,您将看到下表:
如此处所见,正则表达式在第 2 行匹配了 4 个命令,其中动作为a
,为了获得这些结果,您可以执行regex.Match(foo).Groups["commands"].Captures.Select(c => c.Value)
推荐阅读
- python - 直接在 Python 中从网站 rar 文件夹中读取 csv 文件
- django - 从查询集中删除重复项的有效方法?
- python - 如何在一行中编写多个布尔表达式?
- javascript - 如何使 svg 路径元素从元素未知中心点向上和向下缩放?
- java - 如何将文件路径传递给 iText 的 PdfReader
- reactjs - 使用 React Js 从服务器获取数据
- c++ - 如何在 C++ 14 Native DLL(不是 clr)中添加表单(或对话框) - VS 2019
- mysql - MySQL 和 NoSQL 数据库有什么区别?
- angular - Angular *ngFor 在根目录中显示键和值,但不显示子数据
- javascript - React 从多个输入文本字段中读取输入值