54
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

A0A-1B1

A0A1B1

A0A1B1C << 问题孩子

所以我添加了一个检查“-”或“”,然后检查长度。

是否有正则表达式或更有效的方法?

4

7 回答 7

60

用户种类,邮政编码严格,最有效的格式:

/^[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

于 2017-10-15T23:26:20.437 回答
48

将锚点添加到您的模式中:

var regex = /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/;

^意思是“字符串的开头”,$意思是“字符串的结尾”。添加这些锚将防止C滑入匹配,因为您的模式现在期望整个字符串由 6 个(有时是 7 个 - 作为空格)字符组成。现在,这个额外的好处应该可以减轻您随后检查字符串长度的麻烦。

此外,由于您似乎希望允许使用连字符,因此您可以将其滑入一个可选的字符类中,其中包括您最初使用的空间。确保将连字符保留为第一个或最后一个字符;否则,您将需要转义它(使用前导反斜杠)以防止正则表达式引擎将其解释为字符范围的一部分(例如A-Z)。

于 2013-04-02T21:20:47.090 回答
29

这个处理我们和 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 '));
于 2014-11-06T20:28:41.300 回答
15

您对正则表达式有疑问 StatsCan 发布了关于什么是有效的加拿大邮政编码的规则:

邮政编码是由加拿大邮政公司 (CPC) 定义和维护的六字符代码,用于分拣和投递邮件。字符以“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有一个错误的浏览器将其视为 unicode 空间中的任何数字,这可能会给您下游带来问题。

来自:https ://trajano.net/2017/05/canadian-postal-code-validation/

于 2017-05-10T22:24:25.517 回答
0

这是一项可以一次性为您完成所有工作的功能。接受带或不带空格的 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
        }
    }
于 2019-03-25T15:12:04.037 回答
-1
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;
}
于 2015-03-24T13:47:49.157 回答
-1
regex = new RegExp(/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i);
if(regex.test(value))
    return true;
else
    return false;

这是原始问题的较短版本,其中value是任何文本值。此外,无需测试值长度。

于 2019-03-29T17:12:29.997 回答