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

时间:2017-03-03 14:05:02

标签: regex pcre

我有几个测试用例:

坏:

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

好:

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

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

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

这也与(1 + 2) + (6 + 7)匹配,这是不好的,我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:4)

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

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

请参阅regex demo

<强>详情:

  • ^ - 字符串的开头(可以替换为\A,以确保仅匹配字符串的匹配)
  • (\((?:[^()]++|(?1))*\)) - 捕获将被递归匹配的组1:
    • \( - 文字(
    • (?:[^()]++|(?1))* - 零次或多次出现:
      • [^()]++ - 除了()之外的1个字符(占有率不匹配,不允许回溯到模式中)
      • | - 或
      • (?1) - 递归组1模式的子程序调用
    • \) - 文字)
  • $ - 字符串结尾(匹配字符串的结尾,使用\Z,或字符串的最后一端可以与\z匹配)

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