Строка нужного формата и содержит слово только один раз. Регулярное выражение

Клиент может отправлять такие строки на вход.

ZZZ/USD:0.0001

или

USD/ZZZ:100000

короче это типа конвертера валют.

Я написал регулярное выражение под эту формулу

static String COEFFICIENT_PATTERN =
            "^[A-Z]{1,3}+/" + "[A-Z]{1,3}+=" + "[0-1\\u002E]{1,6}";

оно работает.

как дополнить его условием, что должки быть только одно слово USD?

USD/USD=1000 уже не верно


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

В общем случае, чтобы исключть совпадение целой строки, если какое-то одно слово в ней повторяется, можно использовать

static String COEFFICIENT_PATTERN =
    "^(?!.*\\bUSD\\b.*\\bUSD\\b)[A-Z]{1,3}/[A-Z]{1,3}:[0-1\\u002E]{1,6}$";
              ^^^^^^^^^^^^^^^^^^^^^^^^^^

См. пример работы выражения

Или, так как повтор определённого слова тут может случиться только в начале строки один раз через /, в данном случае вы можете использовать

static String COEFFICIENT_PATTERN =
    "^(?!USD/USD:)[A-Z]{1,3}/[A-Z]{1,3}:[0-1\\u002E]{1,6}$";
       ^^^^^^^^^^^

См. пример работы выражения

Блок предварительного просмотра вперёд(?!.*\\bUSD\\b.*\\bUSD\\b) исключает совпадение, если сразу после текущей позиции (а тут эта позиция - начало строки) есть

  • .* - 0+ символов, отличных от символов перевода строки, как можно больше
  • \bUSD\b - целое слово USD
  • .* - 0+ символов, отличных от символов перевода строки, как можно больше
  • \bUSD\b - целое слово USD.
→ Ссылка