根据这个页面(和其他一些页面),DFA 正则表达式引擎可以很好地处理捕获组。我对原子组(或所有格量词)很好奇,因为我最近经常使用它们,无法想象如何做到这一点。
我不同意答案的第一部分:
DFA 不需要处理像原子分组这样的结构......原子分组是一种帮助引擎完成匹配的方法,否则会导致无休止的回溯
原子组不仅对 NFA 引擎的速度很重要,而且它们还允许编写更简单且不易出错的正则表达式。假设我需要在程序中找到所有 C 风格的多行注释。确切的正则表达式类似于:
- 从字面开始
/*
- 吃以下任何东西
- 任何字符,除了
*
- a
*
后跟任何东西,但/
- 任何字符,除了
- 尽可能重复这个
- 以字面结尾
*/
这听起来有点复杂,正则表达式
/\* ( [^*] | \*[^/] )+ \*/
是复杂和错误的(它不能/* foo **/
正确处理)。使用不情愿(惰性)量词更好
/\* .*? \*/
但也是错误的,因为它可以吃掉整条线
/* foo */ @#$!!**@#$ /* bar */
当由于后面的子表达式在垃圾上失败而进行回溯时。将上述内容放在一个原子组中可以很好地解决问题:
(?> /\* .*? \*/ )
这总是有效(我希望)并且尽可能快(对于 NFA)。所以我想知道 DFA 引擎是否能以某种方式处理它。