交互式演示:NFA 引擎是如何工作的
文章导航
分类入口
看得见的算法
正则表达式通常被视为一个“黑盒”:你输入规则和文本,它告诉你是否匹配。但内部发生了什么?为什么有时候它会慢得要死?
为了直观地理解 NFA (非确定性有限自动机) 的并行(或回溯)特性,我编写了一个简单的交互式演示。
交互演示
支持: a-z, 0-9, . (任意), |, *, +, ?, ()
演示说明
- 编译:点击“编译并重置”,JS 脚本会将正则表达式转换为 NFA 图。
- 初始状态:NFA 从起始节点开始,自动通过所有的 $\epsilon$ (Split) 边,计算出初始的状态集合。
- 步进 (Step):每点击一次“下一步”,引擎读入一个字符。
- 引擎检查当前集合中所有的状态。
- 如果某个状态能接受这个字符,就转移到下一个状态。
- 新的状态再次通过 $\epsilon$ 边扩散。
- 形成新的状态集合。
- 并行特性:你会注意到,在某些时刻(比如匹配
(b|c)*时),状态集合里可能同时有多个状态。这就好比量子力学中的“叠加态”,NFA 同时在尝试多条路径。
这就是为什么 NFA 引擎(如 RE2)能保证线性时间复杂度的原因:它不需要回溯,它只是维护了一个有限的状态集合。
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
正则表达式性能优化与 ReDoS 防御实战
深入探讨正则表达式回溯导致的性能问题,拆解 ReDoS 攻击原理、防御策略与真实排查案例。
正则表达式理论:从形式语言到自动机实现
从乔姆斯基层级、Thompson 构造到 NFA/DFA 与代码实现,系统理解正则表达式背后的理论与工程。
DFA 最小化:词法分析器生成的核心
每个正则表达式引擎背后,都有一个 DFA 最小化算法在工作。
完美哈希:从理论到 gperf 实践
编译器怎么在 O(1) 时间内判断一个标识符是不是关键字?用哈希表?但普通哈希表有冲突,最坏情况退化成链表。完美哈希给出了确定性答案:对已知的 n 个键,构造一个完全无冲突的哈希函数,查找时间严格 O(1),空间 O(n)。这是静态字典问题的终极解法。