【问题标题】:What is the difference between (a+b)* and (a*b*)*?(a+b)* 和 (a*b*)* 有什么区别?
【发布时间】:2020-02-07 04:10:45
【问题描述】:

我假设 Σ = {a, b}。 我想找出表示 Σ* 的 RE (Σ* 表示字母表 Σ 上所有可能字符串的集合)

我想出了下面的两个 RE(正则表达式)

(a+b)*
(a*b*)*

但是,我无法自己决定哪个 RE 是正确的,或者两者都是错误的。 所以,请告诉我正确的答案。

【问题讨论】:

  • 后者是正确的。前者要求在每个b 之前至少有一个a,因此例如字符串b 不匹配。
  • 如果这是在计算机科学的背景下 - 形式语言和自动机 - 忽略 paxdiablo 的答案并改用 Welbog 的答案。

标签: regex computer-science automata


【解决方案1】:

+ 运算符通常用于在学术正则表达式中表示联合(|,“或”),而不是“一个或多个”,因为它通常在非学术设置(例如大多数正则表达式实现)中表示.

所以,a+b 表示 [ab]a|b,因此 (a+b)* 表示长度为 0 或更大的任意字符串,包含任意数量的 as 和 bs 以任意顺序。

同样,(a*b*)* 也表示长度为 0 或以上的任意字符串,包含任意数量的 as 和 bs,以任意顺序排列。

这两种表达方式是同一种语言的不同表达方式。

【讨论】:

  • “汽车”和“自动动力移动设备”(汽车和希腊语 αυτοκίνητο(pr. 'aftokinito')的描述不那么极端)也可以指同一件事,但我我想我更喜欢前者。不反对您的答案,只是建议您更喜欢(a+b)* 而不是另一个更好:-)
【解决方案2】:

在正常的正则表达式语法中,(a+b)* 表示零个或多个以a 开头,然后有零个或多个a,然后是b。这会打折像baa(它不是以a 开头)、abbaa 之类的东西(每个a 组之后必须有一个完全b) ,所以不正确。

(a*b*)* 表示零个或多个包含零个或多个a 后跟零个或多个b 的任何序列。这更正确,因为它允许起始字符、字符的任何顺序和数量等等。它还允许Σ* 允许我非常确定应该允许的空字符串(但我会留给你)。

但是,最好选择更简单的[ab]*(或[ab]+,万一您认为空字符串无效)。这基本上为零(一个用于+ 变体)或更多从类[ab] 中提取的任何字符。


但是,可能因为您使用的是Σ,您可能正在讨论正式语言理论(其中Σ 很常见)而不是正则表达式语法(它往往不是)。

如果这种情况,那么您应该了解,有一些正式语言的变体,其中a | b 表达式(实际上是正则表达式语法中的[ab])可以呈现为@ 之一987654343@、a ∨ ba + b,其中每个运算符符号代表“逻辑或”。

这意味着 (a+b)* 实际上是正确的(因为它等同于我上面给出的正则表达式语法),因为它基本上意味着集合 {a, b} 中的任何字符,重复零次或多次。

此外,(a*b*)* 选项也涵盖了这一点,但选择最简单的选项几乎总是更好:-)

【讨论】:

    【解决方案3】:

    根据正则表达式的代数性质,

    (a*b*)* = (a+b)*
    

    因此(a+b)* = (a*b*)*

    额外信息:

    (a+b)* = L(a+b)*
           = (L(a+b))*
           = (L(a) U L(b))*
           = ({a} U {b})*
           = {a,b}*
           = {ε, a, b, aa, bb, ab, abab, aba, bbba,...}
    

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 2012-07-03
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2017-04-06
      • 2010-11-27
      相关资源
      最近更新 更多