我正在寻找一个我已经绞尽脑汁的正则表达式语句。我想给出以下输入:
输入>T_0-p(T_1-p(T_2,K_0),CW_0)
T_0、K_0和CW_0是元素。这些元素总是由单词字符、_和一个整数组成。这些元素在p()操作符内通过- or相互分隔。在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()操作符,这显然不起作用。为此,需要对其进行修改。它必须检查捕获的开括号是否和闭括号一样多。有办法用正则表达式做到这一点吗?有人能帮我吗?或者你对如何实现这一目标有其他的想法吗?
对不起,如果有一个明显的方法,我是新的regex。
我想用Julia实现这个。Julia有perl兼容的正则表达式,由PCRE库提供。
您需要这些regexp:
(((?:[^()]++|(?1))*))(*SKIP)(*F)|w+_d+
(?:G(?!^),|p()(w+_d+(?:-p(((?:[^()]++|(?2))*)))?)
参见regex demo #1和regex demo #2。
Regex #1 details
(((?:[^()]++|(?1))*))(*SKIP)(*F)
-匹配的(可能嵌套的平衡)括号之间的字符串,匹配失败|
-或w+_d+
-一个或多个字母、数字或下划线,_
,然后一个或多个数字。
如果你需要一个组,你可以在w+_d+
图案周围添加(
和)
。注意,它将是第2组。
Regex #2 details:
(?:G(?!^),|p()
-前一个匹配的结束和,
字符,或p(
(w+_d+(?:-p(((?:[^()]++|(?2))*)))?)
-第一组:w+_d+
-一个或多个字母,数字或下划线,_
,然后一个或多个数字(?:-p(((?:[^()]++|(?2))*)))?
-可选的出现-p
- a-p
string(((?:[^()]++|(?2))*))
-第二组(必须在这里定义,因为我们需要递归模式):(
,然后零次或多次出现(
和)
以外的一个或多个字符,或者第二组模式递归,然后是)
字符。