正则表达式德国邮政编码

9
我放弃了。我需要一个(PHP)正则表达式,只匹配从01001到99998开头的5位数字。
因此,1234是无效的,但01234不是。01000是无效的,01002不是,依此类推。除99999之外的任何其他5位数字都是有效的。
我有以下正则表达式,它做到了我所需的--除了它仍然匹配99999。
有人能帮忙吗?谢谢...
^01\d\d[1-9]|[1-9]\d{3}[(?<=9999)[0-8]|[0-9]]$

更新

很抱歉大家,事情比较复杂。我没有解释清楚。 例如,德国的邮政编码也可以是04103(请参见这里的一些其他示例列表)。


3
需要用正则表达式的原因是什么? - Amber
1
我在想,为了便于维护和控制复杂度,您最好先检查字符串是否完全由数字组成,然后再执行数值比较。 - Legolas
1
请务必确保永远不会有来自德国以外的人填写表格。因为如果你恰好在国外有地址,这样的事情会让你彻底疯掉。 - Pekka
我需要一个正则表达式,因为它是一个自动化检查,使用正则表达式来检查所有输入字段的输入字段...是的,这仅适用于德国地址;-) - Hein
标签 german 已作为 2012 年清理 的一部分被移除。 - Abhranil Das
6个回答

21

你已经接近答案了:

^0[1-9]\d\d(?<!0100)0|0[1-9]\d\d[1-9]|[1-9]\d{3}[0-8]|[1-9]\d{3}(?<!9999)9$

但是如果你可以使用一个简单的正则表达式,然后再进行数值比较,可能会更容易阅读。

或者,还有一个更简单的版本:

^(?!01000|99999)(0[1-9]\d{3}|[1-9]\d{4})$

简化版就是“取数字01000-99999,然后通过一个预查去掉两端。”


1
@Hein - 看起来匹配得很好?http://ideone.com/2N0OP(请注意,在$之前有一个错别字的`]`,我已经将其编辑掉了。) - Amber
太棒了 - 就是这样!感谢所有人,特别是Amber! - Hein
当然。如果下一个开发者看了这段代码,只会说:“噢,糟糕”。 - hsz
有没有不使用前瞻/后顾的方法?因为在 macOS 上它们不受支持:https://dev59.com/EVUK5IYBdhLWcg3wmw8S#51568859 - dewey
显示剩余5条评论

6

最快的方法就是检查字符串是否由5位数字组成,然后检查它是否在指定范围内:

if ( preg_match('/^\d{5}$/', $input) && (int) $input > 1000 && (int) $input < 99999 ) {}

1
\b(?!01000)(?!99999)(0[1-9]\d{3}|[1-9]\d{4})\b

编辑:感谢 Hein 的纠正。


0

我找到了许多国家的解决方案。

<?php
$country_code="US";
$zip_postal="11111";

$ZIPREG=array(
    "US"=>"^\d{5}([\-]?\d{4})?$",
    "UK"=>"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$",
    "DE"=>"\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b",
    "CA"=>"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$",
    "FR"=>"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$",
    "IT"=>"^(V-|I-)?[0-9]{5}$",
    "AU"=>"^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$",
    "NL"=>"^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$",
    "ES"=>"^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$",
    "DK"=>"^([D-d][K-k])?( |-)?[1-9]{1}[0-9]{3}$",
    "SE"=>"^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$",
    "BE"=>"^[1-9]{1}[0-9]{3}$"
);

if ($ZIPREG[$country_code]) {

    if (!preg_match("/".$ZIPREG[$country_code]."/i",$zip_postal)){
        //Validation failed, provided zip/postal code is not valid.
    } else {
        //Validation passed, provided zip/postal code is valid.
    }

} else {

    //Validation not available

}
?>

2
是的,当您发布他人的代码时,您应该提供源代码。在这种情况下,原始来源是并仍然是:http://www.pixelenvision.com/1708/zip-postal-code-validation-regex-php-code-for-12-countries/ - John

0
如果您可以避免使用纯正则表达式,这将验证邮政编码:
function validate( $num ) {
    if( !preg_match( '/^\d{5}$/', $num ) ) {
        return false;
    }

    return ( $num > 1000 && $num < 99999 ); 
}

通过此示例,您也可以匹配111111111(长于5个数字)。 - hsz
我认为你应该添加字符串的开头和结尾标记(^和$)。 - Legolas
它可以在没有标记的情况下工作(因为超过5位数的任何内容都大于99999),但还是进行了编辑... - JJJ
是的,但如果这个匹配项是"a11111",转换为整数可能会出问题。 - Legolas

0

这里是德国邮政编码的终极严格解决方案。与其他解决方案不同,该方案仅接受5位数字(66111 = OK6611166111 = wrongasd66111 = wrong)。

正则表达式:\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b


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