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

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

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

  1. 12345
  2. 12345-6789
  3. 12345 1234

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

【问题讨论】:

  • 重复的关闭看起来很粗略 - 受骗者要求一个正则表达式,该正则表达式将匹配任何国家的任何邮政编码,而这个问题要求一个正则表达式匹配邮政编码,这是一个美国 -唯一的一件事,这使得这个问题的范围比受骗者要窄得多——但实际上是可以在受骗者处找到答案。请参阅stackoverflow.com/a/7185241/1709587,其中列出了超过 100 个国家/地区(包括美国)的 Unicode CLDR(旧的,现已弃用,但在许多情况下可能仍然足够)邮政编码正则表达式。美国正则表达式是\d{5}([ \-]\d{4})?。

标签: regex


【解决方案1】:
^\d{5}(?:[-\s]\d{4})?$
  • ^ = 字符串的开头。
  • \d{5} = 匹配 5 位数字(用于条件 1、2、3)
  • (?:…) = 分组
  • [-\s] = 匹配空格(用于条件 3)或连字符(用于条件 2)
  • \d{4} = 匹配 4 位数字(用于条件 2、3)
  • …? = 前面的模式是可选的(对于条件 1)
  • $ = 字符串结束。

【讨论】:

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

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

^\d{5}[-\s]?(?:\d{4})?$
^\[0-9]{5}[-\s]?(?:[0-9]{4})?$
^\[0-9]{5}[-\s]?(?:\d{4})?$
^\d{5}[-\s]?(?:[0-9]{4})?$

Please see this demo for additional explanation.

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

123451234
12345 1234
12345  1234

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

^\d{5}([-]|\s*)?(\d{4})?$

Please see this demo for additional explanation.

正则表达式电路

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}`);
    });
}

【讨论】:

    【解决方案3】:

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

    在@kennytm 的先前回答中:

    ^\d{5}(?:[-\s]\d{4})?$
    

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

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

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

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

    https://regexr.com/

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

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

    【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多