当您对文本的词汇或语义含义感兴趣时,当模式可能不同时,您应该使用解析器.当您只是想要匹配或替换字符模式时,解析器通常是矫枉过正的,无论它们的功能意义如何.
在您的情况下,您似乎对文本背后的含义(代码的"功能组件")感兴趣,因此解析器将是更好的选择.但是,解析器可以在内部使用正则表达式,因此不应将它们视为互斥.
然而,"解析器"并不自动意味着它必须是复杂的.例如,如果您对C代码块感兴趣,则可以简单地解析{和}的嵌套组.这个解析器只对两个标记('{'和'}')以及它们之间的文本块感兴趣.
但是,由于嵌套语义,这里的简单正则表达式比较是不够的.请使用以下代码:
void Foo(bool Bar)
{
if(Bar)
{
f();
}
else
{
g();
}
}
Run Code Online (Sandbox Code Playgroud)
解析器将理解Foo的整体范围,以及Foo中包含的每个内部范围(if和else块).当它遇到每个'{'标记时,它"理解"它们的含义.然而,简单的搜索并不理解文本背后的含义,并且可能将以下内容解释为块,我们当然知道这是不正确的:
{
if(Bar)
{
f();
}
Run Code Online (Sandbox Code Playgroud)