Regex, чтобы совместить слово с уникальными (не повторяющимися) символами
Я ищу регулярное выражение, которое будет соответствовать слову, только если все его символы уникальны, то есть каждый символ в слове появляется только один раз.
Пример:
abcdefg
→ вернет MATCH
abcdefgbh
→ вернет NO MATCH (потому что буква b
повторяется более одного раза)
Ответы
Ответ 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, на другой вопрос некоторое время назад, чтобы получить это.
Прошло некоторое время, так как вопрос был задан, но я подумал, что было бы неплохо также иметь этот шаблон регулярного выражения.