regex - 使用基于DFA的(线性时间)正则表达式: possible?捕获组

标签 regex finite-automata dfa

是否可以使用基于DFA的正则表达式实现捕获组,同时相对于输入长度保持线性时间复杂度?

直觉上我不认为,因为子集构造过程不知道它可能落入了哪个捕获组,但这是我第一次意识到这可能是一个潜在的问题,所以我不知道。

最佳答案

Is it possible to implement capture groups with DFA-based regular expressions while maintaining a linear time complexity with respect to the input length?



是的-至少在捕获组是确定性的情况下。考虑示例正则表达式/a|(a)/;将其与输入的"a"匹配可能会产生捕获的组,也可能不会产生捕获的组。

我认为捕获组可以基于使用finite state transducers的理论基础,就像自动机,但在更改状态时也可以输出字符串。您可以回显输入,但是例如用括号将每个捕获组括起来。

Intuitively I think not, because the subset construction procedure does not know which capture group it may have landed inside, but this is the first time I've realized this may be a potential problem, so I don't know.



确实,这是一个问题。我认为您可以通过用捕获状态标记集合来解决此问题,并类似地区分结果DFA的状态。您可能无法为上述正则表达式生成完全确定性的自动机,就像Wikipedia writes:“某些非确定性的换能器不允许使用等效的确定性的换能器”。

但是,可以修改子集构造过程,请参见Determinization of Transducers。他们的算法似乎围绕以下方面展开:

local ambiguities […] are solved by delaying the outputs as far as needed, until these symbols can be written out deterministically.



例如,正则表达式/ab|(a)c/甚至/(a[bc])|ad/都可以解析为确定性转换器。请注意,与没有捕获组的情况相比,它们的内存表示可能要大得多。

关于regex - 使用基于DFA的(线性时间)正则表达式: possible?捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28941425/

相关文章:

dfa - 我似乎无法为这种语言创建 DFA

python - 如何在代码中实现有限自动机?

theory - 正则表达式 0(0+1)*0+1(0+1)*1 的 DFA 是多少?

java - 连续的 appendReplacement 调用失败

regex - 如何匹配包含unicode字符的完整字符串?

Java - REGEX 构造

Python 有限自动机库

ruby - 使用 UTF-8 字符串将 Ruby 中的第一个字母大写,但有异常(exception)

compilation - 为什么在 NFA 中使用 epsilon 转换?

c++ - dfa 转换函数