DFA正则表达式引擎可以处理原子组吗?
根据此页面(和其他一些),DFA正则表达式引擎可以很好地处理捕获组。 我对原子团体(或占有量词)感到好奇,因为我最近使用了它们,无法想象如何做到这一点。
我不同意答案的第一部分:
DFA不需要处理像原子分组这样的结构......原子分组是一种帮助引擎完成匹配的方式,否则会导致无尽的回溯
原子群不仅对于NFA引擎的速度很重要,而且它们还允许编写更简单且不易出错的正则表达式。 假设我需要在程序中找到所有C风格的多行注释。 确切的正则表达式会是这样的:
/*
*
*
之后是除/
*/
这听起来有点复杂,正则表达式
/* ( [^*] | *[^/] )+ */
是复杂的和错误的(它不处理/* foo **/
正确)。 使用不情愿(懒惰)量词更好
/* .*? */
但也因为它可以吃掉整条线而错误
/* foo */ @#$!!**@#$ /* bar */
当由于后面的子表达式在垃圾上发生故障而回溯时。 将上述内容放在原子组中可以很好地解决问题:
(?> /* .*? */ )
这项工作总是(我希望),并且尽可能快(对于NFA)。 所以我想知道DFA引擎是否可以以某种方式处理它。
DFA不需要处理像原子分组这样的结构。 DFA是“文本导向的”,不同于NFA,它是“正则表达式”,换句话说:原子分组是一种帮助引擎完成匹配的方式,否则会导致无限的回溯,因为(NFA)引擎尝试每一个排列都可能在某个位置找到匹配,甚至不可能匹配。
简单地说,原子分组会抛弃回溯位置。 由于DFA不会回溯(要匹配的文本是针对正则表达式进行检查的,而不是像NFA那样针对文本的正则表达式--DFA为每个决策打开一个分支),丢掉那些不是没有意义的东西。
我建议JFFriedl掌握正则表达式(Google Books),他解释了DFA的总体思路:
DFA引擎:文本导向
将正则表达式的NFA引擎与一个引擎进行对比,该引擎在扫描字符串的同时跟踪“当前正在工作中”的所有匹配。在今晚的例子中,当引擎点击t时,它会在其列表中添加潜在匹配目前正在进行的项目:
[...]
随后扫描的每个字符都会更新可能匹配的列表。 几个字符匹配后,情况就会变成
[...]
在作品中有两个可能的匹配(和一个替代方案,骑士,排除)。 随着g的后续,只有第三种选择仍然可行。 一旦h和t也被扫描,引擎认识到它有一个完整的匹配,并可以返回成功。
我称之为“文本导向”匹配,因为从文本扫描的每个字符都控制引擎。 就像在这个例子中,部分匹配可能是任何数量的不同但可能的匹配的开始。 随着后续字符的扫描,将修剪不再可用的匹配。 甚至有些情况下,“部分匹配进行中”也是完全匹配。 例如,如果正则表达式是⌈to(...)⌋,括号化的表达式变为可选的,但它仍然是贪婪的,所以总是尝试。 在这些括号内进行部分比赛的所有时间内,完整匹配('到')已经被确认,并且保留以防长时间比赛没有完成。
(来源:http://my.safaribooksonline.com/book/programming/regular-expressions/0596528124/regex-directed-versus-text-directed/i87)
关于捕获组和DFA:就我所能理解的链接而言,这些方法不是纯粹的DFA引擎,而是DFA和NFA的混合。
链接地址: http://www.djcxy.com/p/12975.html