我正在使用以下模式来匹配加拿大邮政编码。有更好的方法吗?
const zip = new RegExp(/[a-z][\d][a-z][\s]?[\d][a-z][\d]/, 'gi');
console.log(zip.test("L1K 4W2"));
答案 0 :(得分:2)
正则表达式可能不是代码中的瓶颈,因此您不必担心性能。
但是,常见的错误不是固定正则表达式。您的正则表达式将匹配包含匹配模式的任何字符串。示例:
const zip = new RegExp(/[a-z][\d][a-z][\s]?[\d][a-z][\d]/, 'gi');
console.log(zip.test("123123123L1K 4W2123123123"));
通常这不是理想的行为。在字符串的开头和结尾或至少在单词边界处将您的表达式锚定。
一些语法/样式说明:
[\d]
等应为\d
。RegExp
构造函数。它需要一个字符串,而不是正则表达式文字。无需在此处使用构造函数。g
标志。如果要提取所有匹配项,g
很有用。话虽如此:
// Match whole string
let zip = /^[a-z]\d[a-z]\s?\d[a-z]\d$/i;
console.log(zip.test('123L1K 4W2123')); // false
console.log(zip.test('123 L1K 4W2 123')); // false
console.log(zip.test('L1K 4W2')); // true
// Match word boundaries
zip = /\b[a-z]\d[a-z]\s?\d[a-z]\d\b/i;
console.log(zip.test('123L1K 4W2123')); // false
console.log(zip.test('123 L1K 4W2 123')); // true
console.log(zip.test('L1K 4W2')); // true
答案 1 :(得分:1)
[A-z]\d[A-z]\s?\d[A-z]\d
更好。
a-z
仅包含小写字母。要包括大写字母,必须使用A-z
。 \ d和\ s不需要[]。
答案 2 :(得分:0)
在加拿大,邮政编码的字符1只能是A,B,C,E,G,H,J,K,L,M,N,P,R,S,T,V,X,Y 。邮政编码的任何部分均未使用字母D,F,I,O,Q和U。因此,用于验证它们的更精确(虽然笨拙)的正则表达式将是:
\A(A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y)[0-9](A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z)( )[0-9](A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z)[0-9]\Z