Подтвердить что ты не робот

Эффективное регулярное выражение для функции почтового кода Канады

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 < проблемный ребенок

поэтому я добавил чек для "-" или "", а затем проверит длину.

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

4b9b3361

Ответ 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

Позволяет:

  • H2t-1B8
  • H2Z 1B8
  • H2Z1B8

Запрещает:

  • 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;
}