Как проверить имена пользователей с помощью matches (regex)?


Я пытаюсь поместить следующее выражение в функцию matches, но я предполагаю ошибки при попытке компиляции правил.

 ^[a-zA-Z](([._-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$

.validate правило выглядит следующим образом:

".validate": "newData.val() === auth.uid         
&& newData.val().matches(^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$)" 

Я получаю:

" Invalid escape: '.'"
1 2

1 ответ:

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

Ваше текущее регулярное выражение требует длины строки от 5 до 10 символов и запрещает 2 последовательных символа ., _ и -. Первое условие должно быть проверено вне регулярного выражения с помощью некоторого кода, например newData.val().length >= 5 && newData.val().length <= 10 , а второе просто требует перегруппировки и повторной количественной оценки:

.matches(/^[a-z][a-z0-9]*([._-][a-z0-9]+)*$/)

См. регулярное выражение демо .

Подробности :

  • ^ - начало строки
  • [a-z] - строчная буква (если вы добавите /i в конце, она будет чувствительна к регистру)
  • [a-z0-9]* - ноль или более a-z и 0-9 символов
  • ([._-][a-z0-9]+)* - а ., _ или -, за которым следует один или несколько (это требует, чтобы [a-z0-9] был в конце, если есть ., _ или - в строке) символы из 0-9 и a-z диапазонов
  • $ - конец струнный якорь.

Примечание вам не нужно экранировать символы внутри класса символов, так как . и _ не являются специальными символами внутри него, а - в конце или начале скобочного выражения (класса символов) является литеральным дефисом.