加拿大邮政编码功能的高效正则表达式
Efficient regex for Canadian postal code function
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 <<问题儿童
所以我添加了对"-"或"的检查,然后检查了长度。
有没有正则表达式或更有效的方法?
用户种类,邮政编码严格,最有效的格式:
/^[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
向模式添加锚点:
var regex = /^[A-Za-z]'d[A-Za-z][ -]?'d[A-Za-z]'d$/;
^
的意思是"字符串的开始",$
的意思是"字符串的结束"。添加这些锚点将防止C
滑入匹配项,因为您的模式现在期望整个字符串由 6 个(有时为 7 个空格(字符组成。这个额外的好处现在应该减轻您随后检查字符串长度的麻烦。
此外,由于您似乎希望允许连字符,因此您可以将其放入包含您最初使用的空间的可选字符类中。请务必将连字符保留为第一个或最后一个字符;否则,您将需要对其进行转义(使用前导反斜杠(以防止正则表达式引擎将其解释为字符范围的一部分(例如 A-Z
(。
这个处理我们和 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 '));
您对正则表达式有问题 StatsCan发布了什么是有效加拿大邮政编码的规则:
邮政编码是由定义和维护的六个字符的代码 加拿大邮政公司 (CPC( 用于分拣和 投递邮件。人物以"安娜楠"的形式排列, 其中"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/
这是一个可以一次性为您完成所有操作的功能。 接受带或不带空格的 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
}
}
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;
}
regex = new RegExp(/^[ABCEGHJ-NPRSTVXY]'d[ABCEGHJ-NPRSTV-Z][-]?'d[ABCEGHJ-NPRSTV-Z]'d$/i);
if(regex.test(value))
return true;
else
return false;
这是原始问题的较短版本,其中值是任何文本值。此外,无需测试值长度。
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- 正则表达式在字符串中找到base64
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- 使用正则表达式评估电子邮件地址时出现性能问题
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 正则表达式只允许 x 个整数
- 使用正则表达式将输入格式设置为单字符逗号、单字符逗号等
- 改进用于验证付款金额的正则表达式
- 正则表达式与数字中的第二个点匹配
- 键按正则表达式以查找具有负值的小数
- 一个正则表达式,用于从JS中的HTML标记中删除id、样式和类属性
- 将po-box javascript正则表达式转换为c#regex
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 最高效的正则表达式
- 加拿大邮政编码功能的高效正则表达式
- 用于"Surround"的高效正则表达式类似{{..}}的情况