Как заставить регулярное выражение сопоставлять только слова с определенными символами для имен пользователей и не определять недопустимые символы? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть правило для имен пользователей, и все из этих правил не должно совпадать с именем пользователя. Имена пользователей могут содержать следующие символы:

  • Прописные буквы
  • Строчные буквы
  • Числа
  • Подчеркивание (_)
  • Da sh (-)
  • Пробелы

Эти имена пользователей действительны:

User1
user2
_user_3
5user-
user 6
USER 7

Недопустимы:

user@8
9us(ser
us=er 10
*user 11

Поскольку они имеют символы которые не были определены как разрешенные. Когда я использую это регулярное выражение:

[\-\_a-zA-Z0-9].*(?![\w,])

Это соответствует всем им.

Есть ли способ сопоставления только того, что определено, вместо использования [^] для исключения каждого недопустимого символа? Я скорее не создаю строку в коде, содержащую каждый отдельный символ Юникода, который не разрешен, потому что их тысячи.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Вы можете использовать шаблон регулярного выражения следующим образом: / ^ [-_ a-zA-Z0-9 \ s] + $ / что это значит:

"^" С самого начала "[-_a -zA-Z0-9 \ s] "Искать один из этих символов" + "один или несколько раз" $ "до конца

, поэтому с начала до конца он будет принимать только то, что я положил между "[]"

const pattern = /^[\-\_a-zA-Z0-9\s]+$/;
    const goods = ['User1',
          'user2',
          '_user_3',
          '5user-',
          'user 6',
          'USER 7']
    
    const bads = ['user@8',
          '9us(ser',
          'us=er 10',
          '*user 11']
        
    goods.forEach(good => console.log("Is '" + good + "' a valid username? : " + pattern.test(good)))
    
    bads.forEach(bad => console.log("Is '" + bad + "' a valid username? : " + pattern.test(bad)))

PD: проверьте https://www.debuggex.com/ на наличие в regex

1 голос
/ 21 апреля 2020

Почему бы просто не инвертировать ваш набор и test, если в строке есть символы вне набора?

const pattern = /[^\-\_a-zA-Z0-9]/;
const good = "esqew";
const bad = "es@qew";

if (!pattern.test(good)) {
  // proceed as normal
} else {
  // username contains disallowed characters
}

console.log("Is '" + good + "' a valid username? : " + !pattern.test(good));
console.log("Is '" + bad + "' a valid username? : " + !pattern.test(bad));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...