Уникальная последовательность похожих символов в строке с использованием регулярных выражений - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть несколько тестовых строк:

  1. "x"
  2. "mm"
  3. "x mm"
  4. "yy x mm"
  5. " xx мм y мм "

Я хочу сделать регулярное выражение, которое должно соответствовать строкам 1,2,3,4, но не 5.

Итак, мои ограничения на совпадение:

  1. Одна последовательность алфавита должна встречаться один раз в строке.(например, «y» - это последовательность один y, а «yy» - это последовательность двух y, но они содержат одинаковый алфавит, поэтому они противоречивы и не могут встречаться вместе)
  2. В строке допускаются только определенные алфавиты(для моего случая "xym").
  3. Любая последовательность может встречаться в начале, середине или конце строки.Но он должен иметь префикс или суффикс с несловарным символом, если другая последовательность алфавита предшествует или следует за ней соответственно.
  4. Нет необходимости, чтобы все последовательности алфавита присутствовали в строке.

Примечание: - Я хочу, чтобы только одно регулярное выражение решило эту проблему.Потому что с отдельным регулярным выражением и итерацией я уже сделал это.Я ищу однострочное решение для проверки моей строки.

Решение, которое я пробовал:

/(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/

Но оно также соответствует 5-му случаю.

1 Ответ

2 голосов
/ 04 апреля 2019

Вы можете использовать

/^(?!.*\b([xym])\1*\b.*\b\1+\b)(?:\s*\b([xym])\2*\b)*\s*$/

См. Демоверсию regex .

Детали

  • ^ - начало строки
  • (?!.*\b([xym])\1*\b.*\b\1+\b) - отрицательный прогноз, который не соответствует совпадению, если сразу после начала строки
    • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше
    • \b([xym])\1*\b - целое слово, состоящее из одинаковых символов, x, y или m
    • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше
    • \b\1+\b - целое слово, состоящее из символа, захваченного в группе 1
  • (?:\s*\b([xym])\2*\b)* - 0 или более повторений
    • \s* - 0 или более пробелов
    • \b([xym])\2*\b - целое слово, состоящее из 1 или более одинаковых символов, x, y или m
  • \s* - 0 или более пробелов
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...