仅当括在括号中时才匹配模式
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))*\))$
详情:
^
- 字符串开头(可以替换为 \A
,以确保仅匹配字符串开头)
(\((?:[^()]++|(?1))*\))
- 捕获将被递归匹配的第 1 组:
\(
- 文字 (
(?:[^()]++|(?1))*
- 零次或多次出现:
[^()]++
- 除了 (
和 )
之外的 1+ 个字符(所有格匹配以禁止回溯到模式中)
|
- 或
(?1)
- 递归第 1 组模式的子例程调用
\)
- 文字 )
$
- 字符串结尾(要匹配字符串的结尾,请使用 \Z
,或者字符串的结尾可以用 \z
匹配)
请注意,(?R)
构造不能在此处使用,因为它会递归整个模式,并且锚点(^
和 $
)会使字符串内的所有匹配失败。
我有几个测试用例:
差:
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))*\))$
详情:
^
- 字符串开头(可以替换为\A
,以确保仅匹配字符串开头)(\((?:[^()]++|(?1))*\))
- 捕获将被递归匹配的第 1 组:\(
- 文字(
(?:[^()]++|(?1))*
- 零次或多次出现:[^()]++
- 除了(
和)
之外的 1+ 个字符(所有格匹配以禁止回溯到模式中)|
- 或(?1)
- 递归第 1 组模式的子例程调用
\)
- 文字)
$
- 字符串结尾(要匹配字符串的结尾,请使用\Z
,或者字符串的结尾可以用\z
匹配)
请注意,(?R)
构造不能在此处使用,因为它会递归整个模式,并且锚点(^
和 $
)会使字符串内的所有匹配失败。