我有几个测试用例:
坏:
1 + 2
(3 + 4) + 5
(1 + 2) + (3 + 4)
好:
(1 + 2)
((3 + 4) + 5)
((1 + 2) + (3 + 4))
我想要一个与括号内的任何内容匹配的正则表达式。基本上,如果括号外有任何东西,那就不好了。你应该假设字符串总是正确的,所以你不必计算起始和结束括号。
我尝试了以下操作:^\(.*\)$
这也与(1 + 2) + (6 + 7)
匹配,这是不好的,我不知道如何做到这一点。
答案 0 :(得分:4)
您可以使用带有subroutine call的正则表达式,以递归方式匹配嵌套的(...)
:
^(\((?:[^()]++|(?1))*\))$
请参阅regex demo
<强>详情:
^
- 字符串的开头(可以替换为\A
,以确保仅匹配字符串的匹配)(\((?:[^()]++|(?1))*\))
- 捕获将被递归匹配的组1:
\(
- 文字(
(?:[^()]++|(?1))*
- 零次或多次出现:
[^()]++
- 除了(
和)
之外的1个字符(占有率不匹配,不允许回溯到模式中)|
- 或(?1)
- 递归组1模式的子程序调用\)
- 文字)
$
- 字符串结尾(匹配字符串的结尾,使用\Z
,或字符串的最后一端可以与\z
匹配)请注意,此处不能使用(?R)
构造,因为它会递归整个模式,并且锚点(^
和$
)会使字符串内的所有匹配失败。