将整个字符串与正则表达式

时间:2017-10-28 12:27:10

标签: javascript regex

我正在使用正则表达式模式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,但是这允许字符串开头的任何乱码,这意味着整个字符串总是无效的邮政编码。

如何将模式与整个字符串严格匹配?

2 个答案:

答案 0 :(得分:3)

你的正则表达式有这样的形状:^A|B$。 您似乎并不期望这与AgibberishgibberishB匹配,而您实际上正在寻找^(A|B)$。 这样写的, 它只会匹配AB, 它不会与AgibberishgibberishB匹配。

顺便说一下这部分正则表达式看起来像一个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})$ ),并且只有第二个选项锚定到字符串的末尾(^)。

您可以将整个事物包装在(非捕获)组中:

$