【问题标题】:what is regular expression not generated over {a,b}?什么是没有在 {a,b} 上生成的正则表达式?
【发布时间】:2010-04-20 22:20:05
【问题描述】:

我真的被这两个问题困扰了两天多。我试图弄清楚这个问题是什么意思。我的导师也在外地。

问题 1:编写一个正则表达式,用于仅不是由表达式在 {a,b} 上生成的字符串:(a+b)****a(a+b)****。解释你的推理。

我尝试了第二个问题。你觉得还有比这个更好的答案吗?

什么是一组包含奇数个as 或恰好两个bs (a((a|b)(a|b))****|bb) 的字符串的正则表达式,我知道代表任何奇数长度的a,RE 是a((a|b)(a|b))****

【问题讨论】:

  • “生成于{a, b}”意味着{a, b}字母表。字符串"zzz" 显然不是由正则表达式生成的,但由于z 不是字母表的一部分,因此不在讨论范围内。

标签: regex string regex-negation


【解决方案1】:

这是第一个问题的开始。首先考虑这个正则表达式生成的字符串:

(a+b)*a(a+b)*
  • 必须以a AND 开头
  • 每个b 必须在其前面至少有一个a 并且
  • 必须有aab,否则字符串必须以a 结尾。

与此相反的是:

  • 不能以a OR 开头
  • 至少有一个b 不在a 之后或
  • 字符串仅包含重复的ab

对于第二个问题,您应该检查您是否正确理解了该问题。您的解释似乎是:

包含(奇数个a和任意个b)或(正好两个b和没有a)的字符串集的正则表达式是什么。

但另一种解释是这样的:

包含(奇数个 a 和任意数量 b)或(正好两个 b 和 任意数量 a)的字符串集的正则表达式是什么。

【讨论】:

  • 哦,伙计……我在看你说的话……但它太混乱了……我还是不明白……好像它必须以a开头?这是问题的一部分吗? + 号是​​否代表更改 |?
  • @Loop:有没有可能是你抄错题了?
  • 嗯,可能 + 表示或运算符。那么我的答案又会是正确的......(已经删除了它)。打算再次取消删除它,只是为了案例。 :)
  • @Loop:我认为主要问题是你不知道(a+b) 是什么意思。去查找你的课程笔记并查看你所教的内容,然后用这些信息更新你的问题。我看到您正在使用| 在您的问题中替换另一个位置。如果你被教给同一事物两个不同的符号,我会感到惊讶,但如果(a+b) 意味着交替,问题会容易得多。
【解决方案2】:

要匹配两个a,您应该使用aa 之类的东西,对吗? 现在我们知道+ 是1 或更多的量词,* 是0 或更多的量词。所以如果我们想重复整个模式,我们可以把它放在一个组中,然后像这样重复整个模式:(aa)+

那会匹配:

  • aa
  • aaaa

但不是:

  • a(因为aa至少需要2项)`
  • aaa(因为aa 会匹配前两个,但你会有一个额外的a

如果我们想让奇数变成偶数,我们可以简单地在组外添加一个额外的a,如下所示:a(aa)+。但是,由于我们想要一个没有特定最小值的奇数,我们不应该使用 +,因为这将需要至少 3 个 a

所以整个答案是:(bb|a(aa)*)

【讨论】:

  • 用零解释来纠正作业问题,解释为什么最初的答案不正确似乎有点不酷。
  • @Ladenedge:很公平,我会添加一个解释:)
  • 没有提到不允许在“奇数个a”的字符串中出现b。我会说表达式应该是:(bb|b*a(b*ab*a)*b*),这样在奇数个a之间可以出现任意多个b。
  • 这很有可能phild,我没有想到这一点。如果是这样,那么我的回答确实不正确。
  • 为什么投反对票?我看不出这个答案有什么问题。我今天没有票了,不能投票:)
【解决方案3】:

听起来第一个问题是要求您为与提供的正则表达式不匹配的字符串集编写一个正则表达式。

例如,假设问题是要求对由aa+ 在{a} 上匹配的字符串集 使用正则表达式。好吧,这里有一些匹配的字符串:

  • 'aa'
  • 'aaaa'
  • 'aaaaa'

哪些字符串不匹配?以下是仅有的两个:

  • ''
  • 'a'

后一组的正则表达式是a?

关于第二个问题,我建议提出一些正面和负面的测试用例。通过你的正则表达式运行一些这样的字符串,看看会发生什么:

  • 'a'(应该通过)
  • 'aaa'(应该通过)
  • 'bb'(应该通过)
  • ''(应该失败)
  • 'aa'(应该失败)
  • 'aba'(应该失败)

祝你好运!

【讨论】:

    【解决方案4】:

    表达式(a+b)*a(a+b)* 只是意味着:必须在字符串内有一个a。此表达式唯一不能生成的字符串是:b*

    【讨论】:

    • 请看这里+ 符号的不同含义:我的教授总是将它用作or 运算符,而在大多数实际实现中它被用作“一个或多个”运算符,| 符号表示or
    【解决方案5】:

    这个表达式意味着 RE 必须在表达式中包含至少 1 个“A”。

    这个表达式不接受

    'b' 'b'* 或者 空集

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 2013-06-30
      • 1970-01-01
      • 2021-01-10
      • 2019-11-27
      • 1970-01-01
      • 2013-10-13
      • 2021-12-26
      相关资源
      最近更新 更多