邮政编码的正则表达式

时间:2010-04-05 06:44:24

标签: regex

  

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

我需要正则表达式,它可以满足我对邮政编码的所有三个条件。 E.g-

  1. 12345
  2. 12345-6789
  3. 12345 1234
  4. 任何指针和建议都会非常感激。谢谢!

4 个答案:

答案 0 :(得分:296)

^\d{5}(?:[-\s]\d{4})?$
  • ^ =字符串的开头。
  • \d{5} =匹配5位数(条件1,2,3)
  • (?:…) =分组
  • [-\s] =匹配空格(条件3)或连字符(条件2)
  • \d{4} =匹配4位数(条件2,3)
  • …? =之前的模式是可选的(条件1)
  • $ =字符串结束。

答案 1 :(得分:0)

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

^\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.

RegEx电路

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

enter image description here

测试

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

答案 2 :(得分:0)

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

在@kennytm的先前答案中:

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

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

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

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

我建议使用RegEx修补的有用工具链接如下:

https://regexr.com/

当我发现RegEx的功能与我需要的功能相似但可以进行更好地定制时,我会经常使用此工具。它还具有一个精美的RegEx参考菜单和信息界面,使您知道更改如何影响您输入的示例文本的匹配项。

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

答案 3 :(得分:0)

您“使用Google吗?” commonly used regular expressions ...在Perl世界中,Regexp::Common ...依此类推。