自动机与克莱恩星



我正在学习自动机。你能帮我了解带有 Kleene 闭包的自动机是如何工作的吗?假设我有字母 a,b,c,我需要找到以 Kleene 星号结尾的文本 - 如 ab*bac - 它将如何工作?

问题似乎更多的是关于自动机如何处理Kleene闭包,而不是Kleene闭包的含义。

使用简单的正则表达式,例如abc,设计一个自动机来识别它是非常简单的。 到目前为止,每个状态基本上都告诉您在表达式中的位置。 状态 0 表示尚未看到任何内容。 状态 1 表示它被看到a . 状态 2 表示它被看到ab . 等。

Kleene闭包的困难在于像ab*bc这样的模式引入了歧义。 一旦自动机看到了a,然后面对一个b,它就不知道这个bb*的一部分还是它后面的文字b,直到它读取更多的符号——也许更多——它才会知道。

简单的答案是,自动机只是有一个状态,字面意思是它还不知道走了哪条路。

在简单的情况下,您可以直接构建此自动机。 在一般情况下,你通常会构建一种称为非确定性有限自动机的东西。您可以模拟 NDFA,或者(如果性能至关重要)可以应用将 NDFA 转换为确定性算法的算法。 该算法本质上会为您生成所有模棱两可的状态。

Kleene 星号('*') 表示您可以根据需要出现任意次数(0 或更多)出现该字符。 a*将匹配任意数量的 a。

(ab)*将匹配任意数量的字符串"ab"

如果您尝试匹配表达式中的实际星号,则编写它的方式完全取决于您正在使用的正则表达式的语法。对于一般情况,反斜杠用作转义字符:

*将匹配星号。

要识别末尾的模式,请使用串联:

(a U b)*c*将匹配末尾包含 0 个或多个"c"的任何字符串,前面是任意数量的 a 或 b。

对于以 Kleene 星号结尾的匹配文本,同样,字符串可以出现 0 次或多次:

ab(c)* - 可能的匹配:ab,abc abcc,abccc等。

a(bc)* - 可能的匹配:a,abc,abcbc,abcbcbc等。

你的英语表达 ab*bac 是这样的:

A 后跟

0 或更多 B 后跟 BAC

strings that would evaluate as a match to the regular expression if used for search
abac
abbbbbbbbbbac
abbac
strings that would not match
abaca //added extra literal
bac //missing leading a

如前面的答案中所述,实际搜索 * 需要一个特定于实现的转义字符,并且需要了解您选择的语言/库。

最新更新