关于正则表达式的问题

时间:2019-04-05 09:48:21

标签: computer-science regular-language

我对正则表达式有一些疑问。从我看来,您只能将*用作字母数,但是如果我想写L = {a ^ nb ^ n | n> = 0},我将如何在正则表达式中显示字母数相等。 / p>

一般来说,我如何显示正则表达式中字母数量之间的任何关系?

1 个答案:

答案 0 :(得分:0)

您碰到了形式语言理论中一个非常重要的想法-纯正/理论正则表达式无法匹配语言a ^ n b ^ n!这是一个重要的结果。 Myhill-Nerode定理是理解为什么会发生这种情况的好方法,但从根本上讲,可以归结为:如果您可以证明没有有限的自动机可以接受该语言,则它不是正则表达式,也没有正则表达式。

特别是对于您的语言,假设它是正则并且有一个正则表达式。然后我们知道有一个确定性的有限自动机接受该语言。我们可以进一步推断出,存在一个确定性有限自动机,其状态越少越好-最小DFA。令此DFA中的状态数为p。现在,考虑我们语言中的字符串a ^ p b ^ p。由于状态数为p,且字符串长度大于p-1,因此DFA在处理长度为2p的字符串时必须在某个点循环。令x为遍历此循环时处理的a ^ p b ^ p的子字符串。然后,由于DFA接受a ^ p b ^ p,它还必须接受通过遍历循环多次或完全不遍历循环而获得的任何字符串。也就是说,我们可以摆脱子字符串x,或者将其更改为x ^ 2或x ^ k,并且该字符串也应使用我们的语言。 x是否有适合我们的选择?事实证明,没有-无论我们选择a ^ pb ^ p的哪个子字符串,更改出现的次数都会使我们得到的字符串不是我们的语言(它只会更改a的数量,仅更改b的数量) ,或中间的a和b的顺序)。因此,我们的DFA不存在,因此没有正则表达式。基本上,这是另一种工具对常规语言的抽奖引理的长期证明。

能够描述语言a ^ n b ^ n的能力最差(规范)的计算系统是无上下文语言的类别。上下文无关的语法可用于描述这些语言的生成方式。您所用语言的CFG是这样的:

S -> aSb
S -> epsilon

使用此方法的方法是从S(非终止起始符号)开始,然后使用产生式(映射规则)来导出中间表达式,直到只剩下一串仅包含终止符号的字符串(我们的终止符号是和b)。我们可以生成像S-> aSb-> aaSbb-> aaaSbbb-> aaabbb这样的aaabbb。

现在,如果您询问使用“ regex”库的应用程序编程,则这些库通常提供更多功能,可捕获非常规语言。他们可能已经使那些不敬虔的怪物与Turing等效,请在GitHub上查看仅基于“ regex”构建的Quake的实现。