我什么时候应该使用解析器?

Léo*_* 준영 8 regex parsing

我在Regexes中遇到了将代码划分为功能组件的问题.它们可能会破裂,或者它们可能需要很长时间才能完成.经验提出了一个问题:

"我什么时候应该使用解析器?"

lc.*_*lc. 9

当您对文本词汇或语义含义感兴趣时,当模式可能不同时,您应该使用解析器.当您只是想要匹配或替换字符模式时,解析器通常是矫枉过正的,无论它们的功能意义如何.

在您的情况下,您似乎对文本背后的含义(代码的"功能组件")感兴趣,因此解析器将是更好的选择.但是,解析器可以在内部使用正则表达式,因此不应将它们视为互斥.


然而,"解析器"并不自动意味着它必须是复杂的.例如,如果您对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)