Javascript: Regex для исключения пробелов и специальных символов. - PullRequest
1 голос
/ 09 мая 2020

Мне нужно регулярное выражение для проверки,

  1. Должно быть длиной 18
  2. Первые 5 символов должны быть либо (xyz34 | xyz12)
  3. Остальные 13 символов должно быть буквенно-цифровым c только буквы и цифры, не допускается использование пробелов или специальных символов.

У меня есть шаблон, подобный здесь, '/^(xyz34|xyz12)((?=.*[a-zA-Z])(?=.*[0-9])){13}/g'

Но это позволяет использовать пробелы и специальные символы, такие как ($,% и et c), что нарушает правило №3.

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

Ответы [ 3 ]

1 голос
/ 09 мая 2020
/^(xyz34|xyz12)[a-zA-Z0-9]{13}$/

Это должно работать,

  • ^ утверждает позицию в начале строки
  • 1-я группа захвата (xyz34 | xyz12)
    • 1-я альтернатива xyz34 буквально соответствует символам xyz34 (с учетом регистра)
    • Вторая альтернатива xyz12 буквально соответствует символам xyz12 (с учетом регистра)
  • Соответствует одиночному символу, представленному в списке ниже [ a-zA-Z0-9] {13}
  • {13} Квантификатор - соответствует ровно 13 раз
1 голос
/ 09 мая 2020

Вы не должны оценивать поисковые запросы количественно. Это непотребляющие шаблоны , то есть последовательные положительные просмотры проверяют наличие своих шаблонов, но не продвигает индекс регулярного выражения , они проверяют текст в той же позиции . Нет смысла повторять их 13 раз. ^(xyz34|xyz12)((?=.*[a-zA-Z])(?=.*[0-9])){13} равно ^(xyz34|xyz12)(?=.*[a-zA-Z])(?=.*[0-9]) и означает, что строка может начинаться с xyz34 или xyz12, а затем должна содержать как минимум 1 букву и как минимум 1 цифру.

Вы можете подумать об устранении проблемы используя шаблон потребляющий , например:

  • Если вам все равно, содержат ли последние 13 символов только цифры или только буквы, используйте шаблоны, предложенные другими пользователями, например /^(?:xyz34|xyz12)[a-zA-Z\d]{13}$/ или /^xyz(?:34|12)[a-zA-Z0-9]{13}$/
  • Если должен быть хотя бы 1 di git и хотя бы 1 буква среди этих 13 буквенно-цифровых c символов, используйте /^xyz(?:34|12)(?=[a-zA-Z]*\d)(?=\d*[a-zA-Z])[a-zA-Z\d]{13}$/.

См. Демонстрацию regex # 1 и regex demo # 2 .

ПРИМЕЧАНИЕ : это литералы регулярных выражений, не используйте их внутри одинарные или двойные кавычки!

Подробности

  • ^ - начало строки
  • xyz - общий префикс
  • (?:34|12) - соответствие группы без захвата 34 или 12
  • (?=[a-zA-Z]*\d) - должно быть не менее 1 di git после любых 0+ букв справа от текущая nt location
  • (?=\d*[a-zA-Z]) - после любых 0+ цифр справа от текущего местоположения должно быть хотя бы 1 буква
  • [a-zA-Z\d]{13} - 13 букв или цифр
  • $ - конец строки.

JS демонстрация:

var strs = ['xyz34abcdefghijkl1','xyz341bcdefghijklm','xyz34abcdefghijklm','xyz341234567890123','xyz14a234567890123'];
var rx = /^xyz(?:34|12)(?=[a-zA-Z]*\d)(?=\d*[a-zA-Z])[a-zA-Z\d]{13}$/;
for (var s of strs) {
  console.log(s, "=>", rx.test(s));
}
1 голос
/ 09 мая 2020

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

/^xyz(34|12)[a-zA-Z0-9]{13}$/g

regex fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...