【问题标题】:Walkthrough of regex match正则表达式匹配演练
【发布时间】:2019-11-07 20:39:52
【问题描述】:

谁能帮我理解正则表达式引擎如何匹配以下内容:

a(bc)*

反文:abc

例如,需要多少步?每一步会发生什么?例如,类似:

  • 第一步是将正则表达式中的字母“a”与文本“abc”中的“a”进行匹配。因为这不是可选的/重复的,所以在这个位置没有存储回溯。

【问题讨论】:

标签: regex


【解决方案1】:

理想情况下,正则表达式(如果它是真正的正则表达式)首先转换为 NFA(非确定性有限自动机)的图形表示,可能是这样的:

a(bc)*:

(0)-- a --> (1) ---b--> (2) -- ε --> ((3)) 
             ^           |
              `-----c----'

0 是开始状态; ((3)) 是接受状态。 ε 是一个不消耗输入的空转换。

NFA 可以直接通过 NFA 模拟算法执行。

也可以使用“子集构造”将其编译为 DFA(确定性 F.A.)。 DFA 的状态对应于原始 NFA 状态的集合。我们最终会得到这样的结果:

DFA state    NFA States    Input Next State
--------------------------------------------
0            { 0 }         a     1
1            { 1 }         b     2
2 (accept)   { 2, 3 }      c     1

DFA 的状态 2 对应于 NFA 的两种状态:当 DFA 处于状态 2 时,相应的 NFA 模拟器必须同时处于状态 2 和 3,因为通过 epsilon 转换可以到达状态 3(不消耗输入符号)。 DFA 状态 2 是接受状态,因为它对应的 NFA 集合 { 2, 3 } 包含接受状态。

DFA 只需要很少的步骤;基本上我们只是读取字符并根据当前状态和输入字符分派到表中的下一个状态。如果我们不能派送,那就是不匹配;我们可以停止阅读更多输入。如果我们处理了整个输入,并且处于接受状态,那么就会有匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多