首页 > 解决方案 > 用于捕获最外层括号内的元素的正则表达式语句

问题描述

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

输入

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 兼容的正则表达式。

标签: regexregex-lookaroundsregex-group

解决方案


你需要这些正则表达式:

(\((?:[^()]++|(?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 组模式递归,然后是一个)字符。

推荐阅读