фиксированное количество символов в регулярном выражении


Есть ли способ сопоставить фиксированное число символов в строке фиксированной длины с помощью регулярного выражения?

Пример, Я хочу сопоставить все строки, где длина строки равна 5 и есть ровно 3 алфавита и 2 восклицания (!). Восклицания могут быть в любом месте строки.

Пример совпадений: abc!!, а!б!с,!!АВС,!!БК

Я попытался сопоставить с помощью lookahead, но не смог ограничить длину. Ниже было приведено регулярное выражение, которое я использовал.

(?=w*!w*!w*)[w!]{5}

Это соответствует a!!!б и еще!!!! а также то, чего я не хочу.

2 2

2 ответа:

Это можно сделать с помощью регулярного выражения на основе lookahead.

^(?=(?:\w*!){2}\w*$)[\w!]{5}$

Живая Демонстрация

Наверное, проще всего просто указать все возможности.

(?=\w\w\w!!|\w\w\!\w\!|\w\w\!!\w|\w!\w\w!|\w!\w!\w|\w!!\w\w|!\w!\w\w|!!\w\w\w)
Регулярное выражение не очень хорошо работает с комбинациями / перестановками.

Если количество комбинаций слишком велико, сделайте это в тех частях, где первое регулярное выражение собирает потенциальные совпадения,а второе (и далее) продолжает проверять его.

[\w!]{5}
match.count('!') == 2
match.count('\w') == 3

(это неверный код - просто концепция)