【问题标题】:Questions about regular expressions关于正则表达式的问题
【发布时间】:2019-08-27 04:40:11
【问题描述】:

我有几个关于正则表达式的问题。据我所知,您只能使用 * 表示字母数,但如果我想写 L={a^nb^n|n>=0} 我将如何在正则表达式中显示字母数相等。

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

【问题讨论】:

  • 你不能。您描述的语言L 不是正则的,很容易用泵引理证明这一点:en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages 正则表达式能够检查奇偶校验(想想模算术)但不能检查任意子字符串长度。
  • 谢谢你是对的。将语言 L1={0^n 1^k | n mod 3=k mod 3} 是正常的吗?我正在尝试为它找到一个正则表达式,但我无法确定它是否是正则
  • 是的,这种语言是常规的。你可以这样表达:(000)*(111)*|0(000)*1(111)*|00(000)*11(111)*
  • 非常感谢。我已经接近了这个表达式,但没有考虑在 ()* 中放一个字母 3 次

标签: computer-science regular-language


【解决方案1】:

您在形式语言理论中提出了一个非常重要的想法 - 纯/理论正则表达式无法匹配语言 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。

现在,如果您询问使用“正则表达式”库的应用编程,这些库通常会提供更多功能,允许捕获非常规语言。他们可能已经使那些不敬虔的怪物图灵等效,检查 GitHub 以获取仅基于“正则表达式”构建的 Quake 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多