RegExp for Postcode,更快/更好的方法?

时间:2018-11-05 20:25:55

标签: javascript

我正在使用以下模式来匹配加拿大邮政编码。有更好的方法吗?

const zip = new RegExp(/[a-z][\d][a-z][\s]?[\d][a-z][\d]/, 'gi');

console.log(zip.test("L1K 4W2"));

3 个答案:

答案 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

请参见https://www.grcdi.nl/gsb/canada.html#HDE30744DF5A20A8C74F4A30166A00D3504659EB203FCanadaA20A2DA20A5BA5BPostalA20codeA20regularA20expressionA5DA5D00700A00D01001301C02302D03A03D