regex - 将有限状态机转换为正则表达式

标签 regex algorithm fsm

是否有工具(或算法)将有限状态机转换为正则表达式

(反之则不然,那很容易)。

最佳答案

有几种算法可以执行此任务:Brzozowski 和 Mc Cluskey 的“状态消除法”、线性方程组的求解、McNaughton 和 Yamada 的方法等。它们在 Automata and rational expressions 中有很好的描述雅克·萨卡罗维奇 (Jacques Sakarovitch) 着。

特别是状态消除方法很容易理解。关键思想是您将构建一个由有理(也称为正则)表达式而不是字母标记的自动机。首先,确保您有一个初始状态和一个最终状态(如果需要,您可以添加新状态和自发转换)。然后选择一个状态s来消除,比如下图中的状态1。

A simple automaton

然后考虑所有对 (p, q),其中 p 是前任(状态从中转移到 s,图中为 0),q 是后继(状态 2)。对于每个这样的对 (p, q) 添加一个从 p 到 q 的转换,标记为 E(p, q) + E(p, s)E(s, s)*E(s, q) 其中 E(p , s) 表示“标记从 p 到 s 的转换的表达式。一旦你处理了所有的对 (p, q),删除状态 s。在前面的例子中:

An automaton labeled by regexps

这样做直到你消除了所有内部状态(即保留初始状态和最终状态),然后只读取从初始状态到最终状态(这里是 d+ab*c)的转换结果。

您可以使用 Vcsn 来玩弄这个算法,这是一种用于有理表达式和自动机的工具。这是您可以在 Vcsn Sandbox 复制的完整示例。

A complete run of the state elimination method

关于regex - 将有限状态机转换为正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853077/

相关文章:

c++ - 模板基类实现一个默认实现

Oracle 数据库中的 REGEXP 挫败感

python - 莫尔斯电码程序不处理带空格的测试用例

javascript - 用于检查重复空格字符的正则表达式

c++ - OpenCV:一般可以使用哪些方法或二值化技术来提取低质量和低对比度图像的前景?

c++ - 使用特殊规则将一个数组分成两个数组

java - java自动机的简单枚举

c# - 使用 "yield"关键字实现状态机

javascript - 将 CSS "#"(ID) 替换为 .(Class)

使用自定义正则表达式替换 Java 字符串