如何使用DFA正则表达式匹配器实现正则表达式断言/环视(即\ b样式字边界)

时间:2012-04-08 21:25:55

标签: java regex regular-language dfa word-boundary

我想在基于DFA的正则表达式匹配器中实现“单词边界”匹配。有人能告诉我这是怎么做到的吗?

为了给出一些背景知识,我目前正在使用“dk.brics.automaton”库,但它不支持断言(例如\b,字边界)。我需要使用基于DFA的引擎,因为我的主要目标实际上是确定正则表达式的等价性,而不是实际匹配。

此外,以下问题的答案似乎表明这是可能的: DFA based regular expression matching - how to get all matches? 通过说

  

“同样,我们通过向模拟器添加带有特殊指令的epsilon转换来管理它。如果断言通过,则状态指针继续,否则它将被丢弃。”

但是,我无法弄清楚这意味着什么。它是否表明它只能通过特殊类型的epsilon转换来查看其端点,并且只有在其端点满足断言时才能遍历,或者是否可以通过某种方式配置“正常”epsilon转换来完成?如果我需要这些“特殊”类型的epsilon转换,那么如何确定它们(即转换为标准DFA)?

非常感谢指出如何实际实现这一点的任何描述。

1 个答案:

答案 0 :(得分:1)

您无法使用纯DFA实现执行环绕型正则表达式引擎。因为您需要跟踪之前看到的内容,所以您将引擎变成了一个不同的野兽,它将 context 保留在内存中以便进行模式匹配。

对于正则表达式引擎来处理这意味着它需要有特殊的转换来查看已经解析的内容。普通DFA无法执行此操作,因为此上下文被丢弃。顺便说一下,这也是为什么捕获组很慢以及为什么匹配(.*)something(.*)在某些引擎上致命速度慢的原因,因为它会将大量字符复制到缓冲区中以保持此上下文。

我认为您将尝试最小化两个产生的DFA并查看它们是否相等以解决您的问题。如果您将每个“特殊”转换作为唯一处理,并且在执行状态最小化算法时只能与等于自身的转换合并,那么这仍然可以实现。