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<<问题儿童
所以我添加了一张支票" - "或" "然后检查长度。
是否有正则表达式或更有效的方法?
答案 0 :(得分:35)
为您的模式添加锚点:
var regex = /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/;
^
表示“字符串开头”,$
表示“字符串结束”。添加这些锚点将阻止C
滑入匹配,因为您的模式现在期望整个字符串由6个(有时7个作为空格)字符组成。这个额外的奖励现在应该减轻您必须随后检查字符串长度。
此外,由于您似乎想要允许连字符,您可以将其放入包含您最初使用的空间的可选字符类中。务必将连字符保留为第一个或最后一个字符;否则,您将需要将其转义(使用前导反斜杠)以防止正则表达式引擎将其解释为字符范围的一部分(例如A-Z
)。
答案 1 :(得分:18)
这个处理我们和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 '));
答案 2 :(得分:11)
你有正则表达式的问题StatsCan已经发布了有效加拿大邮政编码的规则:
邮政编码是由六个字符的代码定义和维护的 加拿大邮政公司(CPC)的分拣和目的 发送邮件。角色以'ANA NAN'的形式排列, 其中'A'代表字母字符,'N'代表a 数字字符(例如,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/
答案 3 :(得分:5)
用户类型,邮政编码严格:
/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/i
允许:
禁止:
引导Z,W或包含D,F,I,O,Q或U
答案 4 :(得分: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
}
}
答案 5 :(得分:0)
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 是任何文本值。此外,无需测试值的长度。
答案 6 :(得分:-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;
}