如何为包含"a"s、"b"s和"c"s但不超过2个"b"s和3个"c"的所有字符串编写简洁的正则表达式秒

How to write a concise regular expression for all strings containing "a"s, "b"s, and "c"s but no more than 2 "b"s and 3 "c"s

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

那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c*

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

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

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

怎么样:

^(?=(?:[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
  )