用于捕获最外括号内元素的正则表达式语句

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 组模式递归,然后是 ) 字符。