正则表达式用于邮政编码

140

5
这个重复关闭看起来有些可疑 - 重复的问题要求一个正则表达式匹配任何国家的邮政编码,而这个问题要求一个正则表达式匹配仅限于美国的邮政编码,这使得这个问题的范围比重复的问题要窄得多 - 但实际上在重复的问题中确实可以找到答案。请参见 https://dev59.com/nHRB5IYBdhLWcg3wl4IQ#7185241,其中列出了Unicode CLDR(旧的、现在已经过时,但在许多情况下仍然足够)的邮政编码正则表达式,适用于100多个国家,包括美国。美国的正则表达式为\d{5}([ \-]\d{4})? - Mark Amery
我想指出的是,在世界上有一些邮政编码并不仅仅遵循那三个规则。例如,都柏林的邮政编码是D01、D02等等。而巴林的邮政编码是323。另外,像香港这样的城市并没有邮政编码。 - undefined
3个回答

352
^\d{5}(?:[-\s]\d{4})?$
  • ^ = 字符串开始。
  • \d{5} = 匹配5个数字(适用于条件1、2、3)
  • (?:…) = 分组
  • [-\s] = 匹配空格(适用于条件3)或连字符(适用于条件2)
  • \d{4} = 匹配4个数字(适用于条件2、3)
  • …? = 它前面的模式是可选的(适用于条件1)
  • $ = 字符串结尾。

8
\s将匹配任何空白字符,包括制表符和换行符。 - eyelidlessness
2
嗨,不带空格的条件是123451234。 - Ajay Suwalka
5
@ProVega:阅读您链接的(现已删除的)答案上的评论,似乎是不正确的。例如,00544是一个有效的邮政编码;而544则不是。 - Keith Thompson
2
@AjaySuwalka:要适应没有空格的123451234,您需要在[-\s]后面加上一个?,这样它就变成了:^\d{5}(?:[-\s]?\d{4})?$ - Grungondola
7
虽然我来得有点晚,而且可能不是舞会上最漂亮的钟声,但我在连字符两侧添加了额外的可选空格 - 主要是为了美观。/(^\d{5}(?:[\s]?[-\s][\s]?\d{4})?$)/ - Birrel
显示剩余4条评论

7
对于仅限于这三种情况的情况,这些表达式也可能适用:
^\d{5}[-\s]?(?:\d{4})?$
^\[0-9]{5}[-\s]?(?:[0-9]{4})?$
^\[0-9]{5}[-\s]?(?:\d{4})?$
^\d{5}[-\s]?(?:[0-9]{4})?$

请查看此演示以获取更多解释。

如果我们在5个数字和4个数字之间或连续的9个数字邮政编码中出现了意外的额外空格,例如:

123451234
12345 1234
12345  1234

例如,这个表达式将是一个次要选项,具有较少的限制:
^\d{5}([-]|\s*)?(\d{4})?$

请参考此演示以获取更多解释。

正则表达式电路图

jex.im 可视化正则表达式:

输入图像描述

测试

const regex = /^\d{5}[-\s]?(?:\d{4})?$/gm;
const str = `12345
12345-6789
12345 1234
123451234
12345 1234
12345  1234
1234512341
123451`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


1
我知道对于经常使用RegEx的大多数人来说,这可能是显而易见的,但是如果有任何读者是新手,我认为我应该指出我做出的一个有用的观察。在@kennytm之前的一个答案中,我发现了一个有用的技巧,可以帮助我的项目。
^\d{5}(?:[-\s]\d{4})?$

…? = 在条件1中,它前面的模式是可选的

如果您想允许标准的5位数字和+4邮政编码,这是一个很好的例子。

如果您只想匹配美国“Zip + 4”格式的邮政编码(仅满足条件2和3),请删除最后的?,这样它将始终匹配最后的5个字符组。

我推荐的用于调试正则表达式的有用工具如下链接:

https://regexr.com/

我经常使用这个工具,当我发现正则表达式与我需要的类似,但需要进行一些调整时。它还有一个方便的正则表达式参考菜单和信息界面,让您了解您所做的更改如何影响您输入的示例文本的匹配。

如果我有任何错误或遗漏了重要信息,请纠正我。


你可以参考这个正则表达式教程 - https://www.youtube.com/watch?v=8uCHRyK_VMo - Krishnraj Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接