Regex语句,用于捕获最外层括号内的元素



我正在寻找一个我已经绞尽脑汁的正则表达式语句。我想给出以下输入:

输入>
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-pstring
      • (((?:[^()]++|(?2))*))-第二组(必须在这里定义,因为我们需要递归模式):(,然后零次或多次出现()以外的一个或多个字符,或者第二组模式递归,然后是)字符。

最新更新