正则表达式表示a的奇数#和b的奇数

时间:2019-02-08 22:50:47

标签: regex

我需要用{a,b}语言创建一个正则表达式,以接受具有奇数个a和奇数个b的所有字符串。

这是我最新和最接近的尝试:

(((aa+bb)*(ab+ba))*+((ab+ba)(aa+bb)*)*) 

平地机说在“”上失败,我认为这意味着它接受lambda,但我不知道如何。这并不意味着这是唯一的错误。

请帮助!

1 个答案:

答案 0 :(得分:0)

您的尝试有几个问题:

  • 确实匹配“”(不应该):正则表达式的所有部分都是可选的
  • abababba,...等也将被匹配,因为((aa+bb)*(ab+ba))*可以匹配偶数次。
  • 正则表达式的后半部分也是如此

以下是可以解决问题的方法:

(aa+bb)*(ab+ba)((aa+bb)*(ab+ba)(aa+bb)*(ab+ba))*(aa+bb)*

这里的第一(ab+ba)部分不是可选的,因此“”不匹配。

要考虑四个状态:

  1. a的偶数,b的偶数(初始状态)
  2. a的偶数,b的奇数
  3. a个奇数,b个偶数
  4. a的奇数,b的奇数(目标状态)

(aa+bb)*是状态不变的:比赛之前的状态与比赛之后的状态相同。

(ab+ba)将状态1与状态4交换,反之亦然(将状态2与状态3交换,反之亦然,但我们对此不感兴趣)

((aa+bb)*(ab+ba)(aa+bb)*(ab+ba))*是状态不变的,但是它允许状态以任何可能的方式进入任何其他状态并最终返回到原始状态。执行此模式时,起始状态为4,因此它也从该状态退出。

如果我们取出所有状态不变部分,则仅剩下(ab+ba),这会将初始状态转换为目标状态。

此表达式涵盖所有允许的原子状态更改。