regex - 用于捕获最外层括号内的元素的正则表达式语句
问题描述
我正在寻找一个我已经绞尽脑汁的正则表达式语句。我想提供以下输入:
输入
T_0-p(T_1-p(T_2,K_0),CW_0)
T_0、K_0 和 CW_0 是元素。这些元素总是由单词字符后跟 _ 和一个整数组成。这些元素通过 - 或在 p() 运算符中相互分隔。在 p() 运算符中,元素用逗号分隔。另一个 p() 或 - 在 ap() 运算符中的出现也是可能的。
我想要的是有 2 个正则表达式来捕获这些元素。一种用于捕获任何括号之外的元素。目前我正在使用这个:
正则表达式
(?<![,\(])(?<s>\w+_\d)(?![,)])
这给了我:
捕获
T_0
这对我来说很好。
另一个是我正在努力解决的问题。这应该捕获最外面的 p() 运算符内部的内容以及逗号分隔的内容。
所以我可以使用这样的输出:
捕获
Capture 1 : T_1-p(T_2,K_0)
Capture 2 : CW_0
我试图做的是:
正则表达式
p\((?<p1>.+?),(?<p2>.+?)\)
但这显然不起作用,如果您在 ap() 运算符中有另一个 p() 运算符。为此,需要对其进行修改。它必须检查捕获的开括号是否与封闭括号一样多。有没有办法用正则表达式做到这一点?任何人都可以帮助我吗?或者您对如何实现这一点有其他想法?
抱歉,如果有明显的方法可以做到这一点,我是正则表达式的新手。
我想用 Julia 来实现这个。Julia 具有由 PCRE 库提供的与 Perl 兼容的正则表达式。
解决方案
你需要这些正则表达式:
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\w+_\d+
(?:\G(?!^),|p\()(\w+_\d+(?:-p(\((?:[^()]++|(?2))*\)))?)
请参阅正则表达式演示 #1和正则表达式演示 #2。
正则表达式 #1 详细信息
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)
- 匹配且匹配失败的(可能嵌套平衡的)括号之间的字符串|
- 或者\w+_\d+
- 一个或多个字母、数字或下划线、_
,然后是一个或多个数字。
如果你需要一个组,你可以添加(
和)
围绕模式。\w+_\d+
请注意,它将是第 2 组。
正则表达式 #2 详细信息:
(?:\G(?!^),|p\()
- 上一场比赛的结束和一个,
字符,或者p(
(\w+_\d+(?:-p(\((?:[^()]++|(?2))*\)))?)
- 第 1 组:\w+_\d+
- 一个或多个字母、数字或下划线、_
,然后是一个或多个数字(?:-p(\((?:[^()]++|(?2))*\)))?
- 可选的出现-p
- 一个-p
字符串(\((?:[^()]++|(?2))*\))
- 第 2 组(必须在此处定义,因为我们需要递归模式):,(
然后零次或多次出现一个或多个字符,而不是(
和)
或第 2 组模式递归,然后是一个)
字符。
推荐阅读
- reactjs - 为什么 If 在 forEach 结束之前完成?
- r - 如何通过一组列的函数打破排序数据中的关系?
- android - 如果我们可以直接从 MVVM 中的 Fragment 访问 Repository,为什么要使用 ViewModel
- sorting - C ++链表合并排序不断丢失节点
- angular - 组件EmployeedetailComponent的模板出现错误
- reactjs - React:通过布局组件传递道具
- mobile - 会话存储不会在移动设备上动态更改依赖框值
- sorting - 如何获得b-tree的第n个值
- c# - 快速报告导致 mvc .net 中的访问被拒绝错误
- python - 如何在 Plyer 中使用语音到文本?它不工作