Как проверить, есть ли определенные символы на входе, не проверяя их порядок - PullRequest
0 голосов
/ 28 ноября 2018

Есть ли простой способ убедиться, что в RegEx входная строка будет содержать ровно, скажем, один 'a', пять 'b, семь' z 'символов - без проверки порядка?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

«Упорядоченный» способ выполнить вашу задачу с помощью регулярных выражений выглядит следующим образом:

  • Начните с ^ привязки.
  • Затем добавьте 3 положительных прогноза для конкретных условий (подробнеениже).
  • И, наконец, поместите .*$, соответствующий всей строке.

А теперь перейдем к конкретным условиям и соответствующим прогнозам:

  1. Один a: (?=[^a]*a[^a]*$) - должно быть:

    • [^a]* - Количество символов, отличных от a, возможно, 0.
    • a - Тогда только один a.
    • [^a]* - Затем снова количество символов, отличных от a, возможно, 0.
    • $ - И, наконец, конецстрока.
  2. Пять раз b: (?=[^b]*(?:b[^b]*){5}$).На этот раз b[^b]* является содержимым группы без захвата, необходимой из-за квантификатора после него.

  3. Семь раз 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, и вы увидите появляющееся / исчезающее совпадение.

0 голосов
/ 28 ноября 2018

В Java вы можете использовать StringUtils.countMatches, как описано здесь: Как подсчитать количество вхождений символа в строке?

Это не решение на основе регулярных выражений, ноэто решение Java.Несколько ответов показывают другие методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...