📜  正则表达式、正则语法和正则语言

📅  最后修改于: 2021-09-27 22:47:25             🧑  作者: Mango

正如乔姆斯基层次结构中所讨论的,正则语言是最受限制的语言类型,被有限自动机接受。常用表达
正则表达式用于表示正则语言。如果满足以下条件,则表达式是正则表达式:

  • ɸ 是正则语言 ɸ 的正则表达式。
  • ɛ 是正则语言 {ɛ} 的正则表达式。
  • 如果 a ∈ Σ(Σ 表示输入字母表),则 a 是语言为 {a} 的正则表达式。
  • 如果 a 和 b 是正则表达式,则 a + b 也是语言为 {a,b} 的正则表达式。
  • 如果 a 和 b 是正则表达式,ab(a 和 b 的串联)也是正则表达式。
  • 如果 a 是正则表达式,a*(0 次或多次 a)也是正则的。
    Regular Expression Regular Languages
    set of vovels ( a ∪ e ∪ i ∪ o ∪ u ) {a, e, i, o, u}
    a followed by 0 or more b (a.b*) {a, ab, abb, abbb, abbbb,….}
    any no. of vowels followed by any no. of consonants v*.c* ( where v – vowels and c – consonants) { ε , a ,aou, aiou, b, abcd…..} where ε represent empty string (in case 0 vowels and o consonants )

    正则文法:如果一个文法具有 A -> a 或 A -> aB 或 A -> ɛ 形式的规则,则该文法是正则的,其中 ɛ 是一个称为 NULL 的特殊符号。正则语言:如果语言可以用正则表达式来表达,那么它就是正则语言。正则语言的闭包属性
    Union :如果 L1 和 If L2 是两种正则语言,它们的并集 L1 ∪ L2 也将是正则的。例如,L1 = {a n | n ≥ 0} 且 L2 = {b n | n≥0}
    L3 = L1 ∪ L2 = {a n ∪ b n | n ≥ 0} 也是正则的。
    交集:如果 L1 和如果 L2 是两种正则语言,它们的交集 L1 ∩ L2 也将是正则的。例如,
    L1= {a m b n | n ≥ 0 且 m ≥ 0} 且 L2= {a m b n ∪ b n a m | n ≥ 0 且 m ≥ 0}
    L3 = L1 ∩ L2 = {a m b n | n ≥ 0 和 m ≥ 0} 也是规则的。
    Concatenation :如果 L1 和 If L2 是两种常规语言,它们的连接 L1.L2 也将是常规的。例如,
    L1 = {a n | n ≥ 0} 且 L2 = {b n | n≥0}
    L3 = L1.L2 = {a m . b n | m ≥ 0 和 n ≥ 0} 也是规则的。
    Kleene 闭包:如果 L1 是正则语言,它的 Kleene 闭包 L1* 也将是正则的。例如,
    L1 = (a ∪ b)
    L1* = (a ∪ b)*
    补码:如果 L(G) 是正则语言,它的补码 L'(G) 也将是正则的。可以通过从所有可能的字符串减去 L(G) 中的字符串来找到语言的补码。例如,
    L(G) = {a n | n > 3}
    L'(G) = {a n | n <= 3}注意:如果两个正则表达式生成的语言相同,则它们是等效的。例如,(a+b*)* 和 (a+b)* 生成相同的语言。每个由 (a+b*)* 生成的字符串也由 (a+b)* 生成,反之亦然。

    如何解决正则表达式和正则语言的问题?

    问题 1:正则表达式描述了字母表 {0,1} 上的以下哪一种语言?
    (0+1)*0(0+1)*0(0+1)*
    (A) 包含子串 00 的所有字符串的集合。
    (B) 最多包含两个 0 的所有字符串的集合。
    (C) 包含至少两个 0 的所有字符串的集合。
    (D) 以 0 或 1 开头和结尾的所有字符串的集合。

    解决方案:
    选项 A 说它必须有子串 00。但是 10101 也是语言的一部分,但它不包含 00 作为子串。所以这不是正确的选择。
    选项 B 表示它最多可以有两个 0,但 00000 也是语言的一部分。所以这不是正确的选择。
    选项 C 说它必须至少包含两个 0。在正则表达式中,存在两个 0。所以这是正确的选择。
    选项 D 表示它包含所有以 0 或 1 开头和结尾的字符串。但它可以生成以 0 开头和以 1 结尾的字符串,反之亦然。所以这是不正确的。问题 2:下列哪种语言是由给定的语法生成的?
    S -> aS |乙| ∊
    (A) {a n b m | n,m≥0}
    (B) {w ∈ {a,b}* | w 具有相同数量的 a 和 b}
    (C) {a n | n ≥ 0} ∪ {b n | n ≥ 0} ∪ {a n b n | n≥0}
    (D) {a,b}*

    解决方案:选项 (A) 表示它将有 0 个或多个 a 后跟 0 个或多个 b。但是 S -> bS => baS => ba 也是语言的一部分。所以(A)是不正确的。
    选项 (B) 表示它将等于 no。 a 和 b 的。但是但是 S -> bS => b 也是语言的一部分。所以(B)是不正确的。
    选项 (C) 表示它将有 0 个或更多 a 或 0 个或更多 b 或 a 后跟 b 。但如选项 (A) 所示,ba 也是语言的一部分。所以(C)是不正确的。
    选项 (D) 表示它可以按任何顺序包含任意数量的 a 和任意数量的 b。所以(D)是正确的。问题 3:正则表达式 0*(10*)* 表示与
    (A) (1*0)*1*
    (B) 0 + (0 + 10)*
    (C) (0 + 1)* 10(0 + 1)*
    (D) 这些都不是

    解决方案:
    如果两个正则表达式生成的语言相同,则它们是等效的。
    选项(A)可以生成0*(10*)*生成的所有字符串。所以它们是等价的。
    选项 (B)字符串null 不能由给定的语言生成,但 0*(10*)* 可以。所以它们不是等价的。
    选项 (C) 将有 10 作为子字符串,但 0*(10*)* 可能会也可能不会。所以它们不是等价的。

    问题 4:输入字母 a 和 b 的语言的正则表达式,其中两个 a 不在一起:
    (A) (b + ab)* + (b + ab)*a
    (B) a(b + ba)* + (b + ba)*
    (C) 选项 (A) 和 (B)
    (D) 以上都不是

    解决方案:
    选项 (C) 同时说明选项 (A) 和 (B) 是所述问题的正确正则表达式。
    问题中的语言可以表示为 L={&epsilon,a,b,bb,ab,aba,ba,bab,baba,abab,…}。

    在选项 (A) 中,’ab’ 被认为是找出所需正则表达式的构建块。(b + ab)* 涵盖生成的以 ‘b’ 结尾的字符串的所有情况。(b + ab)*a 涵盖所有情况生成的以 a 结尾的字符串。

    对选项 (B) 应用类似的逻辑,我们可以看到正则表达式是将 ‘ba’ 作为构建块推导出来的,它涵盖了所有以 a 开头和 b 开头的字符串的情况。