用于捕获最外括号内元素的正则表达式语句
Regex Statement for capturing elements inside the outermost brackets
我正在寻找一个我已经绞尽脑汁的正则表达式。
我想提供以下输入:
输入
T_0-p(T_1-p(T_2,K_0),CW_0)
T_0、K_0 和 CW_0 是元素。这些元素总是由单词字符后跟 _ 和一个整数组成。这些元素由 - 彼此分隔或位于 p() 运算符内。在 p() 运算符内部,元素以逗号分隔。在 p() 运算符中出现另一个 p() 或 - 也是可能的。
我想要的是有 2 个正则表达式语句来捕获这些元素。一个用于捕获任何括号之外的元素。目前我正在使用这个:
正则表达式
(?<![,\(])(?<s>\w+_\d)(?![,)])
这给了我:
捕获
T_0
这对我来说很好。
另一个是我正在努力解决的问题。这应该捕获最外面的 p() 运算符内部的内容以及用逗号分隔的内容。
所以我可以使用这样的输出:
捕获
Capture 1 : T_1-p(T_2,K_0)
Capture 2 : CW_0
我尝试做的是:
正则表达式
p\((?<p1>.+?),(?<p2>.+?)\)
但是如果你在 p() 运算符中有另一个 p() 运算符,这显然是行不通的。为此,需要对其进行修改。它必须检查捕获的开放括号是否与封闭的括号一样多。
有没有办法用正则表达式来做到这一点?任何人都可以帮我吗?或者您对如何实现它有其他想法吗?
抱歉,如果有明显的方法,我是正则表达式的新手。
我想用 Julia 实现这个。 Julia 具有与 Perl 兼容的正则表达式,由 PCRE 库提供。
您需要这些正则表达式:
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\w+_\d+
(?:\G(?!^),|p\()(\w+_\d+(?:-p(\((?:[^()]++|(?2))*\)))?)
参见regex demo #1 and regex demo #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 组(必须在此处定义,因为我们需要递归模式):(
,然后 [=15= 以外的一个或多个字符出现零次或多次] 和 )
或第 2 组模式递归,然后是 )
字符。
我正在寻找一个我已经绞尽脑汁的正则表达式。 我想提供以下输入:
输入
T_0-p(T_1-p(T_2,K_0),CW_0)
T_0、K_0 和 CW_0 是元素。这些元素总是由单词字符后跟 _ 和一个整数组成。这些元素由 - 彼此分隔或位于 p() 运算符内。在 p() 运算符内部,元素以逗号分隔。在 p() 运算符中出现另一个 p() 或 - 也是可能的。
我想要的是有 2 个正则表达式语句来捕获这些元素。一个用于捕获任何括号之外的元素。目前我正在使用这个:
正则表达式
(?<![,\(])(?<s>\w+_\d)(?![,)])
这给了我:
捕获
T_0
这对我来说很好。
另一个是我正在努力解决的问题。这应该捕获最外面的 p() 运算符内部的内容以及用逗号分隔的内容。
所以我可以使用这样的输出:
捕获
Capture 1 : T_1-p(T_2,K_0)
Capture 2 : CW_0
我尝试做的是:
正则表达式
p\((?<p1>.+?),(?<p2>.+?)\)
但是如果你在 p() 运算符中有另一个 p() 运算符,这显然是行不通的。为此,需要对其进行修改。它必须检查捕获的开放括号是否与封闭的括号一样多。 有没有办法用正则表达式来做到这一点?任何人都可以帮我吗?或者您对如何实现它有其他想法吗?
抱歉,如果有明显的方法,我是正则表达式的新手。
我想用 Julia 实现这个。 Julia 具有与 Perl 兼容的正则表达式,由 PCRE 库提供。
您需要这些正则表达式:
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\w+_\d+
(?:\G(?!^),|p\()(\w+_\d+(?:-p(\((?:[^()]++|(?2))*\)))?)
参见regex demo #1 and regex demo #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 组(必须在此处定义,因为我们需要递归模式):(
,然后 [=15= 以外的一个或多个字符出现零次或多次] 和)
或第 2 组模式递归,然后是)
字符。