Регулярное выражение для проверки буквенно-цифровой строки с необязательным пробелом

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Я работал над регулярным выражением для проверки буквенно-цифровой строки с правилами, приведенными ниже:

  1. Первые ЧЕТЫРЕ начальных символа должны быть числами, а последние ДВА символа должны быть алфавитами.

  2. Пробел является НЕОБЯЗАТЕЛЬНЫМ, но должен быть помещен между двумя символами, что означает, что конечный пробел не допускается.

  3. Длина почтового индекса должна составлять 6 символов, если ПРОБЕЛ не включен, и 7 символов, если пробел включен.

Например.

  • 1111 ZZ
  • 111 1ZZ
  • 1 111ZZ
  • 1111ZZ

Я пытался использовать ^[0-9]{4}[A-Za-z]{2}$|^(?=[d|D] [d|D] ).{7}$ , но это также проверяет 9999 1A как TRUE, что на самом деле должно быть FALSE .

Любые подсказки или помощь будут оценены по достоинству 🙂

Комментарии:

1. Есть ли какая-то особая причина, по которой вы не можете удалить все пробелы (начальные, средние или конечные) и при этом иметь то же семантическое «значение»?

Ответ №1:

 (?=^.{6,7}$)^(([0-9] ?){4}( ?[a-zA-Z]){2})$
  

будет соответствовать

  • 1111 ZZ
  • 111 1ZZ
  • 1 111ZZ
  • 1111ZZ
  • 1111 ZZ

но не

  • 9999 1A
  • 11111 Z
  • 1111111
  • 11 11 ZZ

https://regex101.com/r/lByOx6/1

РЕДАКТИРОВАТЬ: объяснение

Часть «Позитивного прогноза»:

  • (?=^.{6,7}$) это соответствует только в том случае, если строка соответствует требованиям, НО она не «использует» символы.
    • . является любым символом
    • {6,7} касается повторений

so (?=^.{6,7}$) сопоставляется, если строка содержит 6 или 7 символов, независимо от того, что

Затем следующая часть уже «использует» строку, чтобы сказать, что я хочу в начале 4 повторения чисел и, необязательно, пробел, а в конце 2 повторения букв и, необязательно, пробел. Вторая часть будет принимать строки, такие как 1 1 1 1 Z Z , но поскольку они содержат более 7 символов, первая часть не позволит строке совпадать.

Комментарии:

1. Спасибо! это решает проблему. Не могли бы вы также немного объяснить, как работает регулярное выражение? Это поможет 🙂

Ответ №2:

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

 var candidate = input.replaceAll(/s/mg, '');
  

Тогда регулярное выражение просто: /^d{4}[A-Za-z]{2}$/

Если, однако, вам нужно проверить, что на самом деле нет начальных или конечных пробелов, вы можете проверить это заранее и сразу вернуть отрицательный результат.

Комментарии:

1. Как только вы удалили пробелы, [0-9A-Za-z]* становится неправильным (ie будет проверять «111111ZZ»), /^d{4}[A-Za-z]{2} $/ достаточно

2. @MaxXapi Вы правы. Я забыл об ограничении «6 символов».

Ответ №3:

Другой вариант — проверить, содержит ли строка необязательный пробел между первым и последним непробельным символом.

Затем сопоставьте первую цифру, за которой следуют 3 цифры, разделенные необязательным пробелом, и 2 или 3 символа a-zA-Z или пробел.

Использование соответствия без учета регистра:

 ^(?=S  ?S $)d(?: ?d){3}[A-Z ]{2,3}$
  

Объяснение

  • ^ Начало строки
  • (?= Позитивный прогноз, подтвердите, что справа
    • S ?S $ Сопоставьте необязательный пробел между первым и последним символом без пробелов
  • ) Закрыть предварительный просмотр
  • d(?: ?d){3} Сопоставьте цифру и повторите 3 раза необязательный пробел и цифру
  • [a-zA-Z ]{2,3} Сопоставьте 2-3 раза либо символ a-zA-Z, либо пробел
  • $ Конец строки

Демонстрация регулярных выражений