Joi Regex не распознается как шаблон Regex

Я пытаюсь создать правило проверки для поля пароля, которое должно состоять из следующего:

  • Должен быть номер
  • Должен содержать хотя бы одну заглавную букву
  • Должен содержать хотя бы одну строчную букву
  • Должен содержать любой из следующих символов [@ $!]
  • Должно быть от 8 до 20 символов.

Вот шаблон регулярного выражения, который я использую: (?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!#.])[A-Za-z\d$@$!%*?&.]{8,20}

Проверено на https://regexr.com/

Вот проверка Joi:

password: Joi.string()
.regex(
  '/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!#.])[A-Za-zd$@$!%*?&.]{8,20}/'
)
.required()
.min(8)
.max(20)

Трассировка стека ошибок:

{ AssertionError [ERR_ASSERTION]: pattern must be a RegExp
    at internals.String.regex (E:\nodeprojects\voting-system\voting-server\node_modules\joi\lib\types\string\index.js:120:14)
    at Object.<anonymous> (E:\nodeprojects\voting-system\voting-server\src\routes\user.js:16:6)
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
    at Module.require (module.js:593:17)
    at require (internal/module.js:11:18)
    at files.map (E:\nodeprojects\voting-system\voting-server\node_modules\hapi-auto-route\lib\auto-route.js:21:27)
    at Array.map (<anonymous>)
    at Object.module.exports.getRoutes (E:\nodeprojects\voting-system\voting-server\node_modules\hapi-auto-route\lib\auto-route.js:19:18)
    at Object.register (E:\nodeprojects\voting-system\voting-server\node_modules\hapi-auto-route\index.js:16:32)
    at <anonymous>
  generatedMessage: false,
  name: 'AssertionError [ERR_ASSERTION]',
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '==' }

person Ricardo Raz    schedule 30.07.2018    source источник
comment
Заменить '(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!#.])[A-Za-z\d$@$!%*?&.]{8,20}' на /(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!#.])[A-Za-z\d$@$!%*?&.]{8,20}/. В вашей строке есть неэкранированный файл ``.   -  person Seblor    schedule 30.07.2018
comment
см. developer.mozilla.org/en-US/docs/Web / JavaScript / Руководство /   -  person Gabriel Bleu    schedule 30.07.2018
comment
Регулярное выражение @Seblor уже обновлено, но по-прежнему возвращает AssertionError [ERR_ASSERTION]: шаблон должен быть RegExp   -  person Ricardo Raz    schedule 30.07.2018
comment
Вы все еще используете кавычки вокруг выражения, для функции требуется объект RegExp, используйте .regex(/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!#.])[A-Za-zd$@$!%*?&.]{8,20}/)   -  person Ankh    schedule 30.07.2018
comment
Спасибо, это работает.   -  person Ricardo Raz    schedule 30.07.2018


Ответы (1)


Я знаю, что прошло около двух лет, но я думаю, что лучше опоздать, чем никогда не приходить.

Вам просто нужно поместить узор в RegExp()

Вот как я редактировал ваш код :)

const pattern = "/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!#.])[A-Za-zd$@$!%*?&.]{8,20}/";

password: Joi.string()
.regex(RegExp(pattern)) // you have to put it in this way and it will work :)
.required()
.min(8)
.max(20)

Надеюсь, это вам поможет!

person Yazeed AlKhalaf    schedule 29.04.2020