实用正则表达式的高效子匹配提取算法
1. 引言
在处理包含捕获组的正则表达式(RE)和输入字符串时,子匹配提取算法的任务是报告有效的子匹配分配(如果存在),否则报告字符串不匹配。本文将介绍一种高效的子匹配提取算法,该算法通过将正则表达式编译成两个确定性自动机 M3 和 M4 来实现匹配和提取操作。
2. 算法描述
2.1 基本概念
如果 $\alpha \in \Sigma^*$,当且仅当对于某个 $\beta \in L(idx(E))$ 有 $\alpha = \beta|\Sigma$ 时,我们称 $\alpha$ 匹配 RE $E$。对于无捕获组的 RE,这与匹配该表达式的字符串集的标准定义一致。
2.2 算法流程
该算法主要分为预处理阶段和运行时操作阶段:
- 预处理阶段 :将 RE $E$ 编译成两个确定性自动机 M3 和 M4。
- 运行时操作阶段 :使用 M3 确定输入字符串是否匹配 $E$,若匹配则使用 M4 确定要报告的子匹配。
2.3 自动机的构建
2.3.1 自动机 M1
自动机 M1 将 $idx(E)$ 编码为一个自动机。除了用字母表字符标记的转换来消耗输入字符外,还使用标记为 $S_t$ 和 $E_t$ 的单独转换来表示索引为 $t$ 的捕获组的开始和结束,以及用标记为 $+$ 和 $-$ 的转换来表示子匹配优先级。
M1 由元组 $(Q_1, \Sigma_1, \Delta_1, s_1, f_1)$ 描述,其中:
- $
超级会员免费看
订阅专栏 解锁全文
236

被折叠的 条评论
为什么被折叠?



