Как проверить имена пользователей с помощью 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 ответ:
Похоже, что вы не можете использовать 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
диапазонов$
- конец струнный якорь.Примечание вам не нужно экранировать символы внутри класса символов, так как
.
и_
не являются специальными символами внутри него, а-
в конце или начале скобочного выражения (класса символов) является литеральным дефисом.