邮政编码的正则表达式

Posted

技术标签:

【中文标题】邮政编码的正则表达式【英文标题】:regex for zip-code 【发布时间】:2010-04-05 06:44:24 【问题描述】:

可能重复:What is the ultimate postal code and zip regex?

我需要能够满足我所有三个邮政编码条件的正则表达式。例如-

    12345 12345-6789 12345 1234

任何指针和建议将不胜感激。谢谢!

【问题讨论】:

重复的关闭看起来很粗略 - 受骗者要求一个正则表达式,该正则表达式将匹配任何国家的任何邮政编码,而这个问题要求一个正则表达式匹配邮政编码,这是一个美国 -唯一的一件事,这使得这个问题的范围比受骗者要窄得多——但实际上可以在受骗者处找到答案。请参阅***.com/a/7185241/1709587,其中列出了超过 100 个国家/地区(包括美国)的 Unicode CLDR(旧的,现已弃用,但在许多情况下可能仍然足够)邮政编码正则表达式。美国正则表达式是\d5([ \-]\d4)? 【参考方案1】:
^\d5(?:[-\s]\d4)?$
^ = 字符串的开头。 \d5 = 匹配 5 位数字(用于条件 1、2、3) (?:…) = 分组 [-\s] = 匹配空格(用于条件 3)或连字符(用于条件 2) \d4 = 匹配 4 位数字(用于条件 2、3) …? = 前面的模式是可选的(对于条件 1) $ = 字符串结束。

【讨论】:

\s 将匹配任何空格,包括制表符和换行符。 嗨,没有空格的条件 123451234 怎么样 @ProVega:阅读您链接到的(现已删除)答案上的 cmets,这似乎是不正确的。例如,00544 是有效的邮政编码; 544 不是。 @AjaySuwalka:在没有空间的情况下容纳 123451234 所需要做的就是放置一个 ?在 [-\s] 之后,它会变成:^\d5(?:[-\s]?\d4)?$ 晚会有点晚了,也许不是舞会上最漂亮的钟声,但我在连字符的两边添加了额外的可选空格——主要是为了美观。 /(^\d5(?:[\s]?[-\s][\s]?\d4)?$)/【参考方案2】:

仅对于列出的三个条件,这些表达式也可能有效:

^\d5[-\s]?(?:\d4)?$
^\[0-9]5[-\s]?(?:[0-9]4)?$
^\[0-9]5[-\s]?(?:\d4)?$
^\d5[-\s]?(?:[0-9]4)?$

Please see this demo for additional explanation.

如果我们在 5 到 4 位或连续的 9 位邮政编码之间有意外的额外空格,例如:

123451234
12345 1234
12345  1234

例如,此表达式将是具有较少约束的次要选项:

^\d5([-]|\s*)?(\d4)?$

Please see this demo for additional explanation.

正则表达式电路

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

测试

const regex = /^\d5[-\s]?(?:\d4)?$/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`);
    );

【讨论】:

【参考方案3】:

我知道这对于大多数经常使用 RegEx 的人来说可能是显而易见的,但如果任何读者不熟悉 RegEx,我想我应该指出我所做的对我的一个项目有帮助的观察。

在@kennytm 的先前回答中:

^\d5(?:[-\s]\d4)?$

……? = 前面的模式是可选的(对于条件 1)

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

要按照我的需要仅匹配美国“Zip + 4”格式的邮政编码(仅限条件 2 和 3),只需删除最后一个 ?,使其始终匹配最后 5 个字符组。

我推荐的用于修改 RegEx 的有用工具链接如下:

https://regexr.com/

当我发现 RegEx 的功能与我需要的类似,但可以更好地定制时,我经常使用此工具。它还有一个漂亮的 RegEx 参考菜单和信息界面,让您了解您的更改如何影响您输入的示例文本的匹配。

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

【讨论】:

或者你可以参考这个正则表达式教程 - youtube.com/watch?v=8uCHRyK_VMo

以上是关于邮政编码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

仅伦敦邮政编码的正则表达式

文字 编码 正则表达式 切换

邮政编码的正则表达式

什么是最终的邮政编码和 zip 正则表达式?

带有空格的英国邮政编码的Java正则表达式[重复]

刨根究底正则表达式之一:正则表达式概述