我正在使用正则表达式模式supplied by the British government验证英国邮政编码。我的测试目前看起来像这样:
const postcodeRegex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$/g;
console.log(postcodeRegex.test('s75ed')); // returns true
console.log(postcodeRegex.test('s75ed555555')); // returns false
console.log(postcodeRegex.test('555555s75ed')); // returns true
前两个控制台日志是正确的,但我预计第三个会返回false。当模式在字符串的末尾匹配时,测试返回true,但是这允许字符串开头的任何乱码,这意味着整个字符串总是无效的邮政编码。
如何将模式与整个字符串严格匹配?
答案 0 :(得分:3)
你的正则表达式有这样的形状:^A|B$
。
您似乎并不期望这与Agibberish
和gibberishB
匹配,而您实际上正在寻找^(A|B)$
。
这样写的,
它只会匹配A
或B
,
它不会与Agibberish
和gibberishB
匹配。
顺便说一下这部分正则表达式看起来像一个bug:[AZa-z]
。
你可能意味着[A-Za-z]
。
事实上,正则表达式中的所有字母都以大写和小写形式出现。因此,如果添加i
标志并消除其中一种情况,您可以进行简化:
const postcodeRegex = /^((gir 0a{2})|((([a-z][0-9]{1,2})|(([a-z][a-hj-y][0-9]{1,2})|(([a-z][0-9][a-z])|([a-z][a-hj-y][0-9]?[a-z]))))[0-9][a-z]{2}))$/gi;
答案 1 :(得分:2)
如果我们添加一些空格和缩进,你的正则表达式如下:
Scanner
即。只有第一个选项锚定到字符串的开头( ^([Gg][Ii][Rr] 0[Aa]{2})
|
((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$
),并且只有第二个选项锚定到字符串的末尾(^
)。
您可以将整个事物包装在(非捕获)组中:
$