#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я работал над регулярным выражением для проверки буквенно-цифровой строки с правилами, приведенными ниже:
-
Первые ЧЕТЫРЕ начальных символа должны быть числами, а последние ДВА символа должны быть алфавитами.
-
Пробел является НЕОБЯЗАТЕЛЬНЫМ, но должен быть помещен между двумя символами, что означает, что конечный пробел не допускается.
-
Длина почтового индекса должна составлять 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, либо пробел$
Конец строки