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

#regex

Вопрос:

Мне действительно нужна помощь. В настоящее время у меня есть это выражение для проверки имени пользователя, но я хочу добавить еще, чтобы проверить, есть ли в строке более одной точки или подчеркивания. Если это так, верните значение false. если это не так, верните значение true.

 ^([_.a-z0-9]{3,15})$
 

Например, вернутся следующие случаи True :

 .yhjgh899_
_.9874juyh
899j_nnfg
874083.
 

Вернутся следующие случаи False :

 _jdun_jd.
jkuf..jf
 

Комментарии:

1. Регулярные выражения являются мощным инструментом, но они не являются универсальным инструментом для всех. Некоторая обработка может быть выполнена легко (или даже проще) без регулярных выражений. Попробуйте простой подход: проверьте входную строку на соответствие регулярному выражению _ и посмотрите, сколько раз она совпадает. Или, без регулярных выражений, замените строку _ пустой строкой и сравните длину измененной строки с длиной исходной. Если разница больше 1, то входная строка содержит повторяющиеся _ символы. Преимуществом такого подхода является удобочитаемость кода.

Ответ №1:

Вы можете добавить отрицательный внешний вид в начале:

 ^(?!.*?([._]).*?1)[_.a-z0-9]{3,15}$
 

Смотрите демонстрацию регулярных выражений.

Подробные сведения:

  • ^ — начало строки
  • (?!.*?([._]).*?1) — отрицательный просмотр вперед, что не матч, если есть ноль или больше символов, чем другие строки символов, как можно меньше, затем . или _ (захваченные в группе 1, что можно назвать 1 ), потом опять ноль или больше символов, чем другие строки символов, как можно меньше, а затем то же значение, хранящихся в 1-й группе
  • [_.a-z0-9]{3,15} — от трех до пятнадцати строчных букв ASCII, цифр или . / _
  • $ — конец веревки.