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

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

^\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 可视化正则表达式:

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

我知道对于经常使用 RegEx 的大多数人来说,这是显而易见的,但是如果任何读者对 RegEx 都是新手的话,我想我应该指出我的一个观察结果,它对我的一个项目很有帮助。

在@kennytm 之前的回答中:

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

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

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

为了只匹配邮政编码在美国’邮政编码 + 4’格式,因为我需要这样做(条件2和3只) ,只需删除最后的 ?,因此它将始终匹配最后5个字符组。

我推荐的一个修补 RegEx 的有用工具链接如下:

Https://regexr.com/

我经常使用这个工具,当我发现正则表达式做一些类似的东西,我需要,但可以定制得更好一点。它还有一个漂亮的 RegEx 参考菜单和信息丰富的界面,让您知道您的更改如何影响您输入的示例文本的匹配。

如果我有什么错误或者遗漏了一个重要的信息,请纠正我。