Как написать краткое регулярное выражение для всех строк, содержащих "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
)