фиксированное количество символов в регулярном выражении
Есть ли способ сопоставить фиксированное число символов в строке фиксированной длины с помощью регулярного выражения?
Пример, Я хочу сопоставить все строки, где длина строки равна 5 и есть ровно 3 алфавита и 2 восклицания (!). Восклицания могут быть в любом месте строки.
Пример совпадений: abc!!, а!б!с,!!АВС,!!БК
Я попытался сопоставить с помощью lookahead, но не смог ограничить длину. Ниже было приведено регулярное выражение, которое я использовал.
(?=w*!w*!w*)[w!]{5}
Это соответствует a!!!б и еще!!!! а также то, чего я не хочу.
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
(это неверный код - просто концепция)