Подтвердить что ты не робот

Regex, чтобы совместить слово с уникальными (не повторяющимися) символами

Я ищу регулярное выражение, которое будет соответствовать слову, только если все его символы уникальны, то есть каждый символ в слове появляется только один раз.

Пример:
abcdefg → вернет MATCH
abcdefgbh → вернет NO MATCH (потому что буква b повторяется более одного раза)

4b9b3361

Ответ 1

Попробуйте, это может сработать,

^(?:([A-Za-z])(?!.*\1))*$

Объяснение

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Match the regular expression below «(?:([A-Z])(?!.*\1))*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   Match the regular expression below and capture its match into backreference number 1 «([A-Z])»
      Match a single character in the range between "A" and "Z" «[A-Z]»
   Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*\1)»
      Match any single character that is not a line break character «.*»
         Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
      Match the same text as most recently matched by capturing group number 1 «\1»
Assert position at the end of a line (at the end of the string or before a line break character) «$»

Ответ 2

Вы можете проверить, есть ли в строке два экземпляра символа:

^.*(.).*\1.*$

(я просто просто фиксирую один из символов и проверяю, есть ли у него копия в другом месте с обратной ссылкой. Остальные .* не заботятся).

Если регулярное выражение выше соответствует, то строка имеет повторяющийся символ. Если указанное выше выражение не совпадает, то все символы уникальны.

Хорошая вещь о регулярном выражении выше, когда механизм регулярных выражений не поддерживает внешний вид.

Очевидно, решение Джона Ву - прекрасный способ проверить уникальность непосредственно. Он утверждает на каждом символе, что строка впереди не будет содержать текущий символ.

Ответ 3

Это также обеспечит полное соответствие любому длинному слову с неповторяющимися буквами:

^(?!.*(.).*\1)[a-z]+$

Я немного пересмотрел ответ , предоставленный @Bohemian, на другой вопрос некоторое время назад, чтобы получить это.

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