在我访问过的大部分资源中,关于正则表达式的信息都以这种形式呈现:“这些符号用于这个,这些用于那个。如果我们这样写,那么就会有这样的匹配。” 我对以下问题感兴趣
- 从我编写正则表达式的那一刻到某种机制以某种方式找到合适的字符串并产生结果的那一刻之间发生了哪些过程?
- 如果有正则表达式,那么使用 Aho Koras 和 BMX 等各种字符串搜索算法是否有意义?
在我访问过的大部分资源中,关于正则表达式的信息都以这种形式呈现:“这些符号用于这个,这些用于那个。如果我们这样写,那么就会有这样的匹配。” 我对以下问题感兴趣
首先,我建议阅读Jeffrey Friedl 的《正则表达式》一书。她会稍微拉开秘密的帷幕。
现在回答问题。
首先是正则表达式被解析并转换为引擎更方便的形式(有时这称为编译)。有些引擎为状态机制作“图表”,有些引擎立即制作“字节码”。哈布雷的例子。然后遍历此图或“代码”并检查匹配项。
是的,有时它是有道理的。如果正则表达式被使用一次或两次,那么额外的算法就没有意义了。如果正则表达式在加载循环中执行,那么子字符串搜索算法是有意义的。我的经验表明,将正则表达式从pearl“一对一”重写为c ++(Qt)会使处理速度下降两倍(该程序是对大型(数十兆字节)文本的逐行解析文件)。添加一对 if 并检查子字符串以过滤掉明显不正确的选项,从而平衡速度。