至少,您可以获得有限级别的嵌套案例。
对于无嵌套的情况,修改表达式的结尾:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^}](?!\blog\b))*\}
^^^^^^^^^^^^^^^^^^^^^^
让我们分解一下。
- 我们正在严格查看非
}
字符;因此[^}]
. 一旦我们找到第一个}
,我们就完成了。
- 这
(?!foo)
称为否定前瞻断言。它的意思是,“这一点后面没有foo
。”
- 是一个词的
\b
边界。包围log
在\b
s 中确保我们不会捕捉到像“阻塞”和“逻辑”这样的“误报”。你想要唯一的词,“日志”。
- 这
(?:foo)
是一种无需捕获即可对表达式进行分组的方法。这并不重要——现在假设它与(foo)
. 其目的是使整个组可以通过*
.
- 综上所述:我们正在逐个字符地检查,每个字符都不是 a
}
,并且每个字符后面都不是整个单词,log
。
这确保了单词log
不在非嵌套的 catch 块中。
现在,转到嵌套案例。正如@TimPietzcker 指出的那样,PowerGREP 还不支持递归表达式,但出于您的目的,您可能会对有限数量的嵌套感到满意。这是一级嵌套的表达式:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^}](?!\blog\b))*\})*\}
^ ^========================
我们已将该角色添加{
到我们不喜欢的角色类别中。这是因为如果我们遇到这个字符,我们希望通过alternation ( |
) 切换到嵌套大小写,通过比较符号下划线的部分可以看出=
,它是原始“内部”表达式的精确副本。您可以根据需要继续以这种方式嵌套,以捕获任意数量的平衡嵌套。
这是 10 级嵌套的模板,对于大多数此类应用程序来说应该足够了。
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED)*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
SEED
递归种子在哪里, [^{}](?!\blog\b)
. 我是这样写的,所以在视觉上更容易根据需要删除或添加递归。展开,上面变成:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}