Эффективное регулярное выражение для функции почтового кода Канады
var regex = /[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]\d/;
var match = regex.exec(value);
if (match){
if ( (value.indexOf("-") !== -1 || value.indexOf(" ") !== -1 ) && value.length() == 7 ) {
return true;
} else if ( (value.indexOf("-") == -1 || value.indexOf(" ") == -1 ) && value.length() == 6 ) {
return true;
}
} else {
return false;
}
Регулярное выражение ищет шаблон A0A 1B1.
истинные тесты:
A0A 1B1
А0А-1B1
A0A1B1
A0A1B1C < проблемный ребенок
поэтому я добавил чек для "-" или "", а затем проверит длину.
Есть ли регулярное выражение или более эффективный метод?
Ответы
Ответ 1
Добавьте привязки к вашему шаблону:
var regex = /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/;
^
означает "начало строки" и $
означает "конец строки". Добавление этих якорей предотвратит проскальзывание C
в соответствие, так как ваш шаблон теперь ожидает, что целая строка будет состоять из 6 (иногда 7 - как пробелов) символов. Этот дополнительный бонус теперь должен облегчить вам необходимость впоследствии проверять длину строки.
Кроме того, поскольку кажется, что вы хотите разрешить дефисы, вы можете пропустить это в необязательный класс символов, который включает в себя пространство, из которого вы первоначально использовали. Не забудьте оставить дефис в качестве самого первого или самого последнего символа; в противном случае вам нужно будет избежать его (используя ведущую обратную косую черту), чтобы механизм регулярного выражения не интерпретировал его как часть диапазона символов (например, A-Z
).
Ответ 2
Этот обрабатывает нас и коды ca.
function postalFilter (postalCode) {
if (! postalCode) {
return null;
}
postalCode = postalCode.toString().trim();
var us = new RegExp("^\\d{5}(-{0,1}\\d{4})?$");
var ca = new RegExp(/([ABCEGHJKLMNPRSTVXY]\d)([ABCEGHJKLMNPRSTVWXYZ]\d){2}/i);
if (us.test(postalCode.toString())) {
return postalCode;
}
if (ca.test(postalCode.toString().replace(/\W+/g, ''))) {
return postalCode;
}
return null;
}
// these 5 return null
console.log(postalFilter('1a1 a1a'));
console.log(postalFilter('F1A AiA'));
console.log(postalFilter('A12345-6789'));
console.log(postalFilter('W1a1a1')); // no "w"
console.log(postalFilter('Z1a1a1')); // ... or "z" allowed in first position!
// these return canada postal less space
console.log(postalFilter('a1a 1a1'));
console.log(postalFilter('H0H 0H0'));
// these return unaltered
console.log(postalFilter('H0H0H0'));
console.log(postalFilter('a1a1a1'));
console.log(postalFilter('12345'));
console.log(postalFilter('12345-6789'));
console.log(postalFilter('123456789'));
// strip spaces
console.log(postalFilter(' 12345 '));
Ответ 3
У вас возникла проблема с regex StatsCan опубликовал правила для действительного почтового индекса Канады:
Почтовый код представляет собой шестисимвольный код, определенный и поддерживаемый Canada Post Corporation (CPC) с целью сортировки и доставка mail. Персонажи расположены в форме "ANA NAN", где "A" обозначает алфавитный символ, а "N" представляет собой числовой символ (например, K1A 0T6). Почтовый код использует 18 буквенных символов и 10 цифровых символов. Почтовые коды не включают буквы D, F, I, O, Q или U, а первая позиция также не делает использование букв W или Z.
Регулярное выражение должно быть, если вы хотите, чтобы оно было строгим.
/^[ABCEGHJ-NPRSTVXY][0-9][ABCEGHJ-NPRSTV-Z] [0-9][ABCEGHJ-NPRSTV-Z][0-9]$/
Также\d означает, что номер необязательно 0-9
может быть один ошибочный браузер, который рассматривает его как любое число в пространстве Юникода, которое, вероятно, вызовет проблемы для вас ниже.
from: https://trajano.net/2017/05/canadian-postal-code-validation/
Ответ 4
Вид пользователя, строгий почтовый индекс, наиболее эффективный формат:
/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/i
Позволяет:
Запрещает:
- Z2T 1B8 (ведущий Z)
- H2T 1O3 (содержит O)
Ведущие Z, W или содержат D, F, I, O, Q или U
Ответ 5
Это функция, которая сделает все за вас за один раз. Принимает AAA BBB и AAABBB с пробелом или без него.
function go_postal(){
let postal = $("#postal").val();
var regex = /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/;
var pr = regex .test(postal);
if(pr === true){
//all good
} else {
// not so much
}
}
Ответ 6
regex = new RegExp(/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i);
if(regex.test(value))
return true;
else
return false;
Это более короткая версия исходной задачи, где значением является любое текстовое значение. Кроме того, нет необходимости проверять длину значения.
Ответ 7
function postalFilter (postalCode, type) {
if (!postalCode) {
return null;
}
postalCode = postalCode.toString().trim();
var us = new RegExp("^\\d{5}(-{0,1}\\d{4})?$");
// var ca = new RegExp(/^((?!.*[DFIOQU])[A-VXY][0-9][A-Z])|(?!.*[DFIOQU])[A-VXY][0-9][A-Z]\ ?[0-9][A-Z][0-9]$/i);
var ca = new RegExp(/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]( )?\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i);
if(type == "us"){
if (us.test(postalCode.toString())) {
console.log(postalCode);
return postalCode;
}
}
if(type == "ca")
{
if (ca.test(postalCode.toString())) {
console.log(postalCode);
return postalCode;
}
}
return null;
}