«Упорядоченный» способ выполнить вашу задачу с помощью регулярных выражений выглядит следующим образом:
- Начните с
^
привязки. - Затем добавьте 3 положительных прогноза для конкретных условий (подробнеениже).
- И, наконец, поместите
.*$
, соответствующий всей строке.
А теперь перейдем к конкретным условиям и соответствующим прогнозам:
Один a
: (?=[^a]*a[^a]*$)
- должно быть:
[^a]*
- Количество символов, отличных от a
, возможно, 0. a
- Тогда только один a
. [^a]*
- Затем снова количество символов, отличных от a
, возможно, 0. $
- И, наконец, конецстрока.
Пять раз b
: (?=[^b]*(?:b[^b]*){5}$)
.На этот раз b[^b]*
является содержимым группы без захвата, необходимой из-за квантификатора после него.
Семь раз z
: (?=[^z]*(?:z[^z]*){7}$)
.Как и раньше, но на этот раз речь идет о z
, а квантификатор - 7
.
Так что все регулярное выражение может выглядеть следующим образом:
^(?=[^a]*a[^a]*$)(?=[^b]*(?:b[^b]*){5}$)(?=[^z]*(?:z[^z]*){7}$).*$
Рабочий пример см. https://regex101.com/r/gUxC2C/1
Попробуйте поэкспериментировать с содержимым, добавив или удалив a
, b
или z
, и вы увидите появляющееся / исчезающее совпадение.