这个正则表达式是否生成常规语言?

时间:2011-05-18 23:06:25

标签: regex

我被告知正则表达式生成的语言:

(a*b*)*

是正常的。

然而,我的想法与此相反,如下所示。任何人都可以请说明我的想法是对还是错?

我的想法

(a*b*)是指任意数量a的单个序列,后跟任意数量的b(可以为空)。并且该单个序列(不能改变)可以重复0次或更多次。例如:

   a* = a  
   b* = bbbb  
-> (a*b*) = abbbb  
-> (a*b*)* = abbbbabbbbabbbb, ...

另一方面,由于aba不是序列ab的精确重复,因此它不包含在语言中。

aaabaaabaaab  => is included in the language  
aba           => is not included in the language

因此,该语言由序列组成,这些序列是子序列的任意时间重复,该子序列是任意数量的a,后跟任意数量的b。因此,语言不规则,因为它需要堆栈。

7 个答案:

答案 0 :(得分:4)

a为零次或多次,然后是b零次或多次,重复零次或多次。

""
"a"
"b"
"ab"
"ba"
"aab"
"bbabb"
"aba"
全部通过。

答案 1 :(得分:1)

*不是+

aba是那种语言;说“由ab s组成的所有字符串的集合只是一种过于复杂的方式。”

编辑:重复组并不意味着必须严格重复该组的内容;这需要反向引用。 ((a*b*)?\1*
相反,它意味着应该重复组本身,匹配它可以匹配的任何字符串。

答案 2 :(得分:0)

你错了。 :)

0也是一个数量,所以aba就是这种语言。如果正则表达式是(a + b +)+,则不会,因为+表示'1或更多',其中*表示'0或更多'。

答案 3 :(得分:0)

技术上/(a * b *)* /将匹配所有内容,无需任何内容。

因为所有运算符都是*,所以它意味着零或更多。所以,由于零是一个选项,它几乎可以匹配任何东西。

答案 4 :(得分:0)

这是错的,你不需要堆叠。你的DFA只是认为“我可以添加另一个(或不是)吗?”或者“我可以只添加另一个b(或不是)吗?”在无休止的循环中,直到消耗掉这个词。

答案 5 :(得分:0)

这是一个正则表达式,是的。

*说“可以重复0次或更多次”。 +基本相似,不同之处仅在于它需要在最小值上重复一次(或者是1次或更多次)。

这个正则表达式说,有些想法:

  • 重复"below group"零次或多次;
    • 重复a零次或多次;
    • 重复b零次或多次;

可以适用于所有示例。

修改/注意aba也已经过验证。

我希望能提供帮助:p

答案 6 :(得分:0)

基本上,它会匹配任何空的字符串或由一堆a和b组成的字符串。它写着:

(('a' zero or + times)('b' zero or + times) zero of plus times

这就是为什么它匹配aba

(('a' one time)('b' one time)) one time ((a one time)(b zero time)) one time