Как написать краткое регулярное выражение для всех строк, содержащих "a", "b"s и "c"s, но не более 2 "b"s и 3 "c"s

Я совсем недавно начал изучать регулярные выражения и пытался написать один для вопроса выше. Это было бы не сложно, если бы ограничения были наложены только на одну букву (например, не более 2 "б" с).

Тогда ответ будет: 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,...).

Так можно ли написать краткое регулярное выражение для вопроса или, по крайней мере, можно упростить выписывание возможностей?

2 ответа

Решение

Я думаю, что в этом случае вы хотите отрицать то, что вы ищете, потому что найти более двух б или с легко. Вы можете сделать это(?!.*b.*b.*|.*c.*c.*c.*) и скажи, не больше, чем 2 б и 3 с

Как насчет:

^(?=(?:[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
  )
Другие вопросы по тегам