仅当括在括号中时才匹配模式

Match pattern only if enclosed in parentheses

我有几个测试用例:

差:

1 + 2
(3 + 4) + 5
(1 + 2) + (3 + 4)

好:

(1 + 2)
((3 + 4) + 5)
((1 + 2) + (3 + 4))

我想要一个匹配括号内任何内容的正则表达式。基本上,如果括号外有任何内容,那就不好了。你应该假设字符串总是正确的,所以你不必计算开始和结束括号。

我尝试执行以下操作:^\(.*\)$

这也匹配 (1 + 2) + (6 + 7),这很糟糕,我不知道如何做得更好。

您可以使用带有 subroutine call 的正则表达式递归匹配嵌套的 (...)

^(\((?:[^()]++|(?1))*\))$

regex demo

详情:

  • ^ - 字符串开头(可以替换为 \A,以确保仅匹配字符串开头)
  • (\((?:[^()]++|(?1))*\)) - 捕获将被递归匹配的第 1 组:
    • \( - 文字 (
    • (?:[^()]++|(?1))* - 零次或多次出现:
      • [^()]++ - 除了 () 之外的 1+ 个字符(所有格匹配以禁止回溯到模式中)
      • | - 或
      • (?1) - 递归第 1 组模式的子例程调用
    • \) - 文字 )
  • $ - 字符串结尾(要匹配字符串的结尾,请使用 \Z,或者字符串的结尾可以用 \z 匹配)

请注意,(?R) 构造不能在此处使用,因为它会递归整个模式,并且锚点(^$)会使字符串内的所有匹配失败。