如何为包含“a”,“b”和“c”但不超过2“b”和3“c”

时间:2015-09-18 12:28:34

标签: regex formal-languages language-theory

我最近开始学习正则表达式,并试图为上面的问题编写一个。如果限制只放在一个字母上(例如不超过2“b”),那就不难了。

然后答案是:a * c *(b |ε)a * c *(b |ε)a * c *

但是对于2“b”和3“c”s,“a”之间可能的排序总数是24(5选3),所以写一个正则表达式来包含所有这些可能性将非常hefty(因为我们可以选择任意数量的b和cs,只要数字分别小于2和3)(例如bcbcc,cbbcc,bcbc,bcc,b,c,...)。

那么是否可以为问题编写一个简洁的正则表达式,或者至少可以通过简化来写出可能性?

2 个答案:

答案 0 :(得分:1)

怎么样:

^(?=(?:[ac]*b){1,2}[ac]*$)(?=(?:[ab]*c){1,3}[ab]*$)

<强>解释

^               : begining of string
  (?=           : look ahead
    (?:         : non capture group
      [ac]*     : letters a or c 0 or more times
      b         : letter b
    ){1,2}      : the group must be present once or twice
    [ac]*       : letters a or c 0 or more times
    $           : end of string
  )
  (?=           : look ahead
    (?:         : non capture group
      [ab]*     : letters a or b 0 or more times
      c         : letter c
    ){1,3}      : the group must be present once or three times
    [ab]*       : letters a or b 0 or more times
    $           : end of string
  )

答案 1 :(得分:-1)

我认为在这种情况下你想要否定你正在寻找的东西,因为找到两个以上的b或c很容易。你可以这样做(?!.*b.*b.*|.*c.*c.*c.*)并说,不再是2 b和3 c