关于解析:如何使用正则表达式提取”==”两边的操作数?

How to extract the operands on both sides of "==" using regex?

语言和包

python3.8,正则表达式

描述

输入和想要的输出如下:

if (programWorkflowState.getTerminal(1, 2) == Boolean.TRUE) {

想要:programWorkflowState.getTerminal(1, 2)Boolean.TRUE

boolean ignore = !_isInStatic.isEmpty() && (_isInStatic.peek() == 3) && isAnonymous;

想要:_isInStatic.peek()3

boolean b = (num1 * ( 2 + num2)) == value;

想要:(num1 * ( 2 + num2))value

我目前的正则表达式

((?:\\((?:[^\\(\\)]|(?R))*\\)|[\\w\\.])+)\\s*==\\s*((?:\\((?:[^\\(\\)]|(?R))*\\)|[\\w\\.])+)

此模式要匹配 "=="

两侧的 \\((?:[^\\(\\)]|(?R))*\\)[\\w\\.]

regex101.com 上的结果

问题:无法匹配递归部分(num1 * ( 2 + num2)).

递归模式\\((?:m|(?R))*\\)的解释在这里

但是如果我只使用递归模式,它会成功匹配 (num1 * ( 2 + num2)),如图所示。

什么是正确的正则表达式来实现我的目的?


\\((?:m|(?R))*\\) 模式包含一个递归整个模式的 (?R) 结构(等于 (?0) 子例程)。

你需要用一个组来package你需要递归的模式,并使用一个子例程而不是 (?R) 递归结构,例如(?P\\((?:m|(?&aux))*\\)) 在更长的模式中递归模式。

你可以使用

1
((?:(?P\\((?:[^()]++|(?&aux1))*\\))|[\\w.])++)\\s*[!=]=\\s*((?:(?&aux1)|[\\w.])+)

查看这个正则表达式演示(匹配提??供的字符串只需要 6875 步,你的需要 13680)

详情

  • ((?:(?P\\((?:[^()]++|(?&aux1))*\\))|[\\w.])++) - 组 1,匹配一个或多个匹配项(可能由于 ++,不允许回溯到模式中,因此如果后续模式无法匹配,正则表达式引擎无法以另一种方式重新尝试匹配字符串)

    • (?P\\((?:[^()]++|(?&aux1))*\\)) - 一个与 ( 匹配的辅助组"aux1",然后出现零次或多次出现 () 以外的 1 个字符或整个组"aux1"模式,然后是 )
    • | - 或
    • [\\w.] - 字母、数字、下划线或 .
  • \\s*[!=]=\\s* - !=== 两端有零个或多个空格
  • ((?:(?&aux1)|[\\w.])+) - 组 2:组"辅助"模式或字母、数字、下划线或 . 的一个或多个出现。