Was ist die ultimative Postleitzahl und Postleitzahl?

200

Ich suche die ultimative Postleitzahl und Postleitzahl Regex. Ich suche etwas, das den größten Teil (hoffentlich den ganzen) der Welt abdeckt.

Darryl Hein
quelle
4
Ein einziger regulärer Ausdruck für alle Postleitzahlen wäre in den meisten Fällen nutzlos, ganz zu schweigen davon, dass viel Unicode-Codierung erforderlich ist. Viel besser ist es, Regex von Land zu Land zu überprüfen, damit Sie Dinge wie "New York, NY AF23Q" nicht als korrekt validieren.
Ja - dieser Jake.
100
Du hast ein Problem. Sie schreiben eine Regex dafür. Jetzt haben Sie zwei Probleme.
Robert S.
regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 für die Validierung eines Feldes hier klicken
Dinesh Kumar
2
The one that handles all possible future values.
Jodrell

Antworten:

126

There is none.

Postleitzahlen auf der ganzen Welt folgen keinem gemeinsamen Muster. In einigen Ländern bestehen sie aus Zahlen, in anderen können sie Kombinationen aus Zahlen und Buchstaben sein, einige können Leerzeichen enthalten, andere Punkte, die Anzahl der Zeichen kann zwischen zwei und mindestens sechs variieren ...

Was Sie (theoretisch) tun könnten, ist, für jedes Land der Welt einen eigenen regulären Ausdruck zu erstellen, der von der IMO nicht empfohlen wird. Aber Sie würden im Validierungsteil immer noch fehlen: Postleitzahl 12345existiert möglicherweise, aber 12346nicht, vielleicht 12344auch nicht. Wie prüft man das mit einem Regex?

Das kannst du nicht.

Treb
quelle
Ich vermute, dass ein regulärer Ausdruck kompiliert werden könnte, aber dass eine solche Aufgabe viel besser für eine Datenbank geeignet ist. Die Regex würde ungefähr so ​​aussehen wie 10000 | 10001 | 10002 | 10003 | .......
Kibbee
Um
Dinesh Kumar
Sie können zuerst einen regulären Ausdruck verwenden, der Ihrem Land entspricht (siehe en.wikipedia.org/wiki/List_of_postal_codes ) und eine echte Überprüfung durch einen externen Dienst wie geonames.org/export/ws-overview.html
SimonSimCity
3
Meine zwei Cent: In Brasilien sind es tatsächlich 8 Zahlen, 5 gefolgt von einem Strich und 3 weiteren
Jorge Campos
^\d{5}(?:[-\s]\d{4})?$
Aamir Afridi
260

Die Unicode-CLDR enthält die Postleitzahl für jedes Land. (158 Regex insgesamt!)

Google hat auch einen Webdienst mit Informationen zur Formatierung von Adressen pro Land, einschließlich Postleitzahlen, hier - http://i18napis.appspot.com/address (Ich habe diesen Link über http://unicode.org/review/pri180/ gefunden )

Bearbeiten

Hier eine Kopie von postalCodeData.xml Regex:

"GB", "GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}"
"JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"US", "\d{5}([ \-]\d{4})?"
"CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d"
"DE", "\d{5}"
"JP", "\d{3}-\d{4}"
"FR", "\d{2}[ ]?\d{3}"
"AU", "\d{4}"
"IT", "\d{5}"
"CH", "\d{4}"
"AT", "\d{4}"
"ES", "\d{5}"
"NL", "\d{4}[ ]?[A-Z]{2}"
"BE", "\d{4}"
"DK", "\d{4}"
"SE", "\d{3}[ ]?\d{2}"
"NO", "\d{4}"
"BR", "\d{5}[\-]?\d{3}"
"PT", "\d{4}([\-]\d{3})?"
"FI", "\d{5}"
"AX", "22\d{3}"
"KR", "\d{3}[\-]\d{3}"
"CN", "\d{6}"
"TW", "\d{3}(\d{2})?"
"SG", "\d{6}"
"DZ", "\d{5}"
"AD", "AD\d{3}"
"AR", "([A-HJ-NP-Z])?\d{4}([A-Z]{3})?"
"AM", "(37)?\d{4}"
"AZ", "\d{4}"
"BH", "((1[0-2]|[2-9])\d{2})?"
"BD", "\d{4}"
"BB", "(BB\d{5})?"
"BY", "\d{6}"
"BM", "[A-Z]{2}[ ]?[A-Z0-9]{2}"
"BA", "\d{5}"
"IO", "BBND 1ZZ"
"BN", "[A-Z]{2}[ ]?\d{4}"
"BG", "\d{4}"
"KH", "\d{5}"
"CV", "\d{4}"
"CL", "\d{7}"
"CR", "\d{4,5}|\d{3}-\d{4}"
"HR", "\d{5}"
"CY", "\d{4}"
"CZ", "\d{3}[ ]?\d{2}"
"DO", "\d{5}"
"EC", "([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?"
"EG", "\d{5}"
"EE", "\d{5}"
"FO", "\d{3}"
"GE", "\d{4}"
"GR", "\d{3}[ ]?\d{2}"
"GL", "39\d{2}"
"GT", "\d{5}"
"HT", "\d{4}"
"HN", "(?:\d{5})?"
"HU", "\d{4}"
"IS", "\d{3}"
"IN", "\d{6}"
"ID", "\d{5}"
"IL", "\d{5}"
"JO", "\d{5}"
"KZ", "\d{6}"
"KE", "\d{5}"
"KW", "\d{5}"
"LA", "\d{5}"
"LV", "\d{4}"
"LB", "(\d{4}([ ]?\d{4})?)?"
"LI", "(948[5-9])|(949[0-7])"
"LT", "\d{5}"
"LU", "\d{4}"
"MK", "\d{4}"
"MY", "\d{5}"
"MV", "\d{5}"
"MT", "[A-Z]{3}[ ]?\d{2,4}"
"MU", "(\d{3}[A-Z]{2}\d{3})?"
"MX", "\d{5}"
"MD", "\d{4}"
"MC", "980\d{2}"
"MA", "\d{5}"
"NP", "\d{5}"
"NZ", "\d{4}"
"NI", "((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?"
"NG", "(\d{6})?"
"OM", "(PC )?\d{3}"
"PK", "\d{5}"
"PY", "\d{4}"
"PH", "\d{4}"
"PL", "\d{2}-\d{3}"
"PR", "00[679]\d{2}([ \-]\d{4})?"
"RO", "\d{6}"
"RU", "\d{6}"
"SM", "4789\d"
"SA", "\d{5}"
"SN", "\d{5}"
"SK", "\d{3}[ ]?\d{2}"
"SI", "\d{4}"
"ZA", "\d{4}"
"LK", "\d{5}"
"TJ", "\d{6}"
"TH", "\d{5}"
"TN", "\d{4}"
"TR", "\d{5}"
"TM", "\d{6}"
"UA", "\d{5}"
"UY", "\d{5}"
"UZ", "\d{6}"
"VA", "00120"
"VE", "\d{4}"
"ZM", "\d{5}"
"AS", "96799"
"CC", "6799"
"CK", "\d{4}"
"RS", "\d{6}"
"ME", "8\d{4}"
"CS", "\d{5}"
"YU", "\d{5}"
"CX", "6798"
"ET", "\d{4}"
"FK", "FIQQ 1ZZ"
"NF", "2899"
"FM", "(9694[1-4])([ \-]\d{4})?"
"GF", "9[78]3\d{2}"
"GN", "\d{3}"
"GP", "9[78][01]\d{2}"
"GS", "SIQQ 1ZZ"
"GU", "969[123]\d([ \-]\d{4})?"
"GW", "\d{4}"
"HM", "\d{4}"
"IQ", "\d{5}"
"KG", "\d{6}"
"LR", "\d{4}"
"LS", "\d{3}"
"MG", "\d{3}"
"MH", "969[67]\d([ \-]\d{4})?"
"MN", "\d{6}"
"MP", "9695[012]([ \-]\d{4})?"
"MQ", "9[78]2\d{2}"
"NC", "988\d{2}"
"NE", "\d{4}"
"VI", "008(([0-4]\d)|(5[01]))([ \-]\d{4})?"
"PF", "987\d{2}"
"PG", "\d{3}"
"PM", "9[78]5\d{2}"
"PN", "PCRN 1ZZ"
"PW", "96940"
"RE", "9[78]4\d{2}"
"SH", "(ASCN|STHL) 1ZZ"
"SJ", "\d{4}"
"SO", "\d{5}"
"SZ", "[HLMS]\d{3}"
"TC", "TKCA 1ZZ"
"WF", "986\d{2}"
"XK", "\d{5}"
"YT", "976\d{2}"
Chi
quelle
3
Nur mit einem schnellen Scan des AU-Postleitzahl-Regex ... dieser Regex ist sehr einfach und lässt viele Fehlalarme durch, sodass er nicht erschöpfend ist.
Taryn East
7
Die neueste Version von Unicode CLDR mit der Postleitzahl Regex ist Version 26.0.1. In späteren Versionen wurde es entfernt, da die Daten nicht gepflegt wurden und keine anderen zuverlässigen Quellen gefunden werden konnten.
KIKO Software
1
Gleich, sehr einfach für französische Postleitzahl Regex. Verwenden Sie dieses "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developpez.net/forums/d518232/webmasters-developpement-web/…
Vincent D.
Ich verwende jetzt i18napis.appspot.com/address/data/GB . Gibt es Probleme mit diesem Service?
mgol
1
Kleine Korrektur des Kommentars von @ kiko-software: Die neueste Version mit Postleitzahldaten ist 27.0.3 .
Sietse
89

benutze diese regx

$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}$",
    "IN"=>"^\d{6}$"
);
neeraj t
quelle
7
Einer der besseren Versuche, die ich gesehen habe, um das OP tatsächlich zu beantworten. Werden Sie langsamer, wenn Sie mehr Werbung machen, aber einen sauberen und klaren Ansatz.
Rob
3
Es wird nicht langsamer, wenn Sie mehr hinzufügen, wie Rob vorschlägt, da Sie eine der regulären Ausdrücke aus dem Ländercode auswählen würden.
Thomaschaaf
2
Ich sehe, dass du das 2012 gepostet hast. Hast du seitdem mehr?
Rybo111
@ Rybo111 Chi Antwort überprüfen.
Giulio Caccin
5
@ ddunn801, es gibt einen (großen) Unterschied zwischen der Validierung des Musters und der Authentifizierung der Postleitzahl. Die Authentifizierung der Codes ist um ganze Größenordnungen schwieriger, da (zumindest in den USA) Postleitzahlen regelmäßig hinzugefügt und gelöscht werden. In einer idealen Welt würden Sie eine schnelle Überprüfung durchführen, um das Muster zu überprüfen, bevor Sie es an einen Dienst (z. B. USPS) senden, um die gesamte Postanschrift zu überprüfen (Dienste wie diese werden bezahlt, Sie würden es hassen, den Wert mit schlechten Daten zu verschwenden ). Leider ist die Welt alles andere als ideal.
JBH
48
  1. Jedes Postleitzahlensystem verwendet nur AZ und / oder 0-9 und manchmal Leerzeichen / Bindestrich

  2. Nicht jedes Land verwendet Postleitzahlen (z. B. Irland außerhalb von Dublin), aber das werden wir hier ignorieren.

  3. Das kürzeste Postleitzahlenformat ist Sierra Leone mit NN

  4. Das längste ist Amerikanisch-Samoa mit NNNNN-NNNNNN

  5. Sie sollten ein Leerzeichen oder einen Bindestrich zulassen.

  6. Sollte nicht mit Leerzeichen oder Bindestrich beginnen oder enden

Dies sollte Folgendes abdecken:

(?i)^[a-z0-9][a-z0-9\- ]{0,10}[a-z0-9]$
Neil McGuigan
quelle
8
Dies scheint die einzige Antwort zu sein, die eine Überprüfung der geistigen Gesundheit (was wahrscheinlich das OP wollte) und keine vollständige Validierung jeder möglichen Kombination bietet. Genau das, was ich wollte thx
Lukos
1
@ GiulioCaccin H0H0H0 ist eine gültige kanadische Postleitzahl (mit der Kinder Briefe von Canada Post erhalten, die vorgeben, der Weihnachtsmann zu sein), aber das bedeutet nicht, dass es sich um eine gültige Kundenpostleitzahl handelt :)
Neil McGuigan
2
Zu Ihrer
Information
5
Meiner Meinung nach ist dies die einzig gute Antwort. Es kann beispielsweise universell als Vorvalidierung im HTML-Musterattribut verwendet werden.
Blackbam
1
Ich denke, dies ist eine gute Antwort für die Situation, in der man nur eine Überprüfung der geistigen Gesundheit durchführen und nicht genau pro Land validieren möchte. Nur um ohne großen Aufwand ein wenig sauberere Daten zu erhalten - in Fällen, in denen volle Sicherheit erforderlich ist, ist möglicherweise ein Plugin / Service von Drittanbietern erforderlich, wie andere betonten.
Yo Ludke
17

Der Versuch, die ganze Welt mit einem regulären Ausdruck abzudecken, ist nicht vollständig möglich und sicherlich nicht machbar oder empfehlenswert.

Nicht um mein eigenes Horn zu betätigen, aber ich habe einige ziemlich gründliche reguläre Ausdrücke geschrieben, die Sie vielleicht hilfreich finden.

  • Kanadische Postleitzahlen

    Basic validation:
    ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
    
    Extended validation:
    ^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
  • US Postleitzahlen

    ^[0-9]{5}(-[0-9]{4})?$
  • Postleitzahlen in Großbritannien

    ^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$

Es ist nicht möglich, die Richtigkeit zu garantieren, ohne tatsächlich etwas an eine Adresse zu senden und die Person wissen zu lassen, wann sie es erhält, aber wir können die Dinge eingrenzen, indem wir Fälle beseitigen, von denen wir wissen, dass sie schlecht sind.

Scott
quelle
In der erweiterten Version für kanadische Postleitzahlen ist möglicherweise etwas falsch oder fehlt, da die folgende Postleitzahl ungültig ist: E3G 0A1, obwohl sie gültig ist.
Fsschmitt
Ich habe gegen alle 845.495 Postleitzahlen in Kanada validiert und diese Regex-Zeichenfolge enthält einige Korrekturen an der erweiterten Validierung, um alle diese Postleitzahlen zu unterstützen. Hier ist der neue Regex - String für die erweiterte Validierung auf kanadische Postleitzahlen: pastebin.com/vazqFKy4
fsschmitt
14

Dies scheint eine gute Referenz zu sein, obwohl es nicht in Regex ist.

Wirklich, es sei denn, Sie versenden tatsächlich etwas an Ihre Benutzer, ich denke nicht, dass es die Mühe wert ist. Und wenn Sie es versenden, gibt es Adressreinigungswerkzeuge / -dienste, die Sie prüfen können, um es sich leichter zu machen.

Tom Ritter
quelle
Auch wenn es heute die richtige Postleitzahl ist, könnte sich dies in Zukunft sehr wohl ändern. USPS fügt ständig neue hinzu und teilt Bereiche auf. Die einzige Möglichkeit, auf dem Laufenden zu bleiben, besteht darin, zu dem Zeitpunkt zu validieren, zu dem Sie tatsächlich etwas versenden. Einige Städte entscheiden sich aus verschiedenen Gründen sogar dafür, ihre eigene Postleitzahl zu ändern.
NotMe
Es sieht so aus, als hätte jemand den Wiki-Artikel, den Sie oben gepostet haben, mit der Postleitzahl / Postleitzahl für jedes Land an JSON ausgegeben - gist.github.com/matthewbednarski/…
Chris Smith
8

Wir verwenden Folgendes:

Kanada

([A-Z]{1}[0-9]{1}){3}   //We raise to upper first

Amerika

[0-9]{5}                //-or-
[0-9]{5}-[0-9]{4}       //10 digit zip

Andere

Akzeptiere wie es ist

Gavin Miller
quelle
1
Ich würde vorschlagen, ein optionales - [0-9] {4} zum US-amerikanischen hinzuzufügen. Einige Leute benutzen ihre ZIP + 4.
David Thornley
4
/ [0-9] {5} (?: - [0-9] {4})? / Mit dieser Option können Sie beide Stile aus den USA gleichzeitig validieren.
Chas. Owens
2
@ Chas.Owens, die ^ und $ hinzufügen, stellen sicher, dass sie vorher oder nachher nichts anderes eingeben können, wie "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin
7

Abhängig von Ihrer Anwendung möchten Sie möglicherweise einen Regex-Abgleich für die Länder implementieren, aus denen die meisten Ihrer Besucher stammen, und für den Rest keine Validierung (akzeptieren Sie alles).

mbillard
quelle
6
.* 

Big Jump hat Zeilenumbrüche, Leerzeichen und Steuerzeichen vergessen.

Internationale Postleitzahlen sind eine Art Halteproblem.

Benutzer unbekannt
quelle
6

Bitte beachten Sie, dass dies ein ziemlich schwieriges Problem ist, wie aus der akzeptierten Antwort hervorgeht. Ich denke, es hat die Leute auf geonames.org nicht davon abgehalten . Sie haben eine Datei, eine Länderinfodatei , die nicht vollständig in diese Antwort passt - das Limit liegt anscheinend bei 30000 Zeichen. Es gibt reguläre Ausdrücke für ungefähr 150 Länder.

Ich habe die für diese Frage relevanten Bits hier extrahiert:

AD ^(?:AD)*(\d{3})$
AM ^(\d{6})$
AR ^([A-Z]\d{4}[A-Z]{3})$
AT ^(\d{4})$
AU ^(\d{4})$
AX ^(?:FI)*(\d{5})$
AZ ^(?:AZ)*(\d{4})$
BA ^(\d{5})$
BB ^(?:BB)*(\d{5})$
BD ^(\d{4})$
BE ^(\d{4})$
BG ^(\d{4})$
BH ^(\d{3}\d?)$
BM ^([A-Z]{2}\d{2})$
BN ^([A-Z]{2}\d{4})$
BR ^(\d{8})$
BY ^(\d{6})$
CA ^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$
CH ^(\d{4})$
CL ^(\d{7})$
CN ^(\d{6})$
CR ^(\d{4})$
CU ^(?:CP)*(\d{5})$
CV ^(\d{4})$
CX ^(\d{4})$
CY ^(\d{4})$
CZ ^(\d{5})$
DE ^(\d{5})$
DK ^(\d{4})$
DO ^(\d{5})$
DZ ^(\d{5})$
EC ^([a-zA-Z]\d{4}[a-zA-Z])$
EE ^(\d{5})$
EG ^(\d{5})$
ES ^(\d{5})$
ET ^(\d{4})$
FI ^(?:FI)*(\d{5})$
FM ^(\d{5})$
FO ^(?:FO)*(\d{3})$
FR ^(\d{5})$
GB ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
GE ^(\d{4})$
GF ^((97|98)3\d{2})$
GG ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
GL ^(\d{4})$
GP ^((97|98)\d{3})$
GR ^(\d{5})$
GT ^(\d{5})$
GU ^(969\d{2})$
GW ^(\d{4})$
HN ^([A-Z]{2}\d{4})$
HR ^(?:HR)*(\d{5})$
HT ^(?:HT)*(\d{4})$
HU ^(\d{4})$
ID ^(\d{5})$
IL ^(\d{5})$
IM ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
IN ^(\d{6})$
IQ ^(\d{5})$
IR ^(\d{10})$
IS ^(\d{3})$
IT ^(\d{5})$
JE ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
JO ^(\d{5})$
JP ^(\d{7})$
KE ^(\d{5})$
KG ^(\d{6})$
KH ^(\d{5})$
KP ^(\d{6})$
KR ^(?:SEOUL)*(\d{6})$
KW ^(\d{5})$
KZ ^(\d{6})$
LA ^(\d{5})$
LB ^(\d{4}(\d{4})?)$
LI ^(\d{4})$
LK ^(\d{5})$
LR ^(\d{4})$
LS ^(\d{3})$
LT ^(?:LT)*(\d{5})$
LU ^(\d{4})$
LV ^(?:LV)*(\d{4})$
MA ^(\d{5})$
MC ^(\d{5})$
MD ^(?:MD)*(\d{4})$
ME ^(\d{5})$
MG ^(\d{3})$
MK ^(\d{4})$
MM ^(\d{5})$
MN ^(\d{6})$
MQ ^(\d{5})$
MT ^([A-Z]{3}\d{2}\d?)$
MV ^(\d{5})$
MX ^(\d{5})$
MY ^(\d{5})$
MZ ^(\d{4})$
NC ^(\d{5})$
NE ^(\d{4})$
NF ^(\d{4})$
NG ^(\d{6})$
NI ^(\d{7})$
NL ^(\d{4}[A-Z]{2})$
NO ^(\d{4})$
NP ^(\d{5})$
NZ ^(\d{4})$
OM ^(\d{3})$
PF ^((97|98)7\d{2})$
PG ^(\d{3})$
PH ^(\d{4})$
PK ^(\d{5})$
PL ^(\d{5})$
PM ^(97500)$
PR ^(\d{9})$
PT ^(\d{7})$
PW ^(96940)$
PY ^(\d{4})$
RE ^((97|98)(4|7|8)\d{2})$
RO ^(\d{6})$
RS ^(\d{6})$
RU ^(\d{6})$
SA ^(\d{5})$
SD ^(\d{5})$
SE ^(?:SE)*(\d{5})$
SG ^(\d{6})$
SH ^(STHL1ZZ)$
SI ^(?:SI)*(\d{4})$
SK ^(\d{5})$
SM ^(4789\d)$
SN ^(\d{5})$
SO ^([A-Z]{2}\d{5})$
SV ^(?:CP)*(\d{4})$
SZ ^([A-Z]\d{3})$
TC ^(TKCA 1ZZ)$
TH ^(\d{5})$
TJ ^(\d{6})$
TM ^(\d{6})$
TN ^(\d{4})$
TR ^(\d{5})$
TW ^(\d{5})$
UA ^(\d{5})$
US ^\d{5}(-\d{4})?$
UY ^(\d{5})$
UZ ^(\d{6})$
VA ^(\d{5})$
VE ^(\d{4})$
VI ^\d{5}(-\d{4})?$
VN ^(\d{6})$
WF ^(986\d{2})$
YT ^(\d{5})$
ZA ^(\d{4})$
ZM ^(\d{5})$
CS ^(\d{5})$

Hoffentlich habe ich keinen Fehler gemacht, mein Regex-Fu ist ziemlich schwach.

nha
quelle
1
Ich möchte darauf hinweisen, dass die Regex für Frankreich und Großbritannien mögliche Räume nicht berücksichtigt; In Frankreich können Postleitzahlen mit einem Leerzeichen zwischen der zweiten und dritten Ziffer eingegeben werden (dh 75 001 anstelle von 75001). Britische Postleitzahlen werden häufig mit einem Leerzeichen geschrieben (dh SW1 1AA anstelle von SW11AA).
Salcoin
@salcoin Danke für die Eingabe, das habe ich nicht bemerkt (obwohl ich Franzose bin). Sieht so aus, als wäre Chis Antwort in dieser Hinsicht besser.
nha
weil str_replace ein Leerzeichen ohne Leerzeichen super anstrengend ist, oder? : p
Robert Pounder
6

Wenn sich noch jemand für die Validierung von Postleitzahlen interessiert, habe ich eine Lösung gefunden:

Mit können Google Geocoding APIwir die Gültigkeit der Postleitzahl überprüfen, die sowohl die Landesvorwahl als auch eine Postleitzahl selbst hat.

Zum Beispiel lebe ich in der Ukraine, damit ich Folgendes überprüfen kann: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Oder verwenden Sie die JS-API: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Wo 80380eine gültige Postleitzahl für die Ukraine ist, ist tatsächlich jede (#####) gültig.

Google gibt den ZERO_RESULTSStatus zurück, wenn nichts gefunden wurde. Oder OKund ein Ergebnis, wenn beide korrekt sind.

Hoffe das wird hilfreich sein.

Romko
quelle
Das einzige Problem wäre die Begrenzung der Anzahl der Abfragen, die je nach Site / Größe ein Problem darstellen könnten.
Darryl Hein
@ DarrylHein natürlich, aber das ist jetzt ein ziemlich großer Preis, um es zum Laufen zu bringen =)
Romko
4

Wie andere betont haben, ist es unwahrscheinlich, dass ein regulärer Ausdruck sie alle regiert. Mit den Adressformatierungsinformationen der Universal Postal Union - einer wenig bekannten UN-Agentur - können Sie jedoch reguläre Ausdrücke für so viele Länder erstellen, wie Sie benötigen .

Hier sind beispielsweise die Regeln für die Adressformatierung, einschließlich der Postleitzahl, für eine Handvoll Länder (PDF-Format):

Adam Messinger
quelle
2

Das Problem wird sein, dass Sie wahrscheinlich keine guten Mittel haben, um mit den sich ändernden Postleitzahlenanforderungen von Ländern auf der anderen Seite der Welt Schritt zu halten, und dass Sie keine gemeinsamen Sprachen haben. Wenn Sie nicht über ein ausreichendes Budget verfügen, um dies nachzuverfolgen, ist es mit ziemlicher Sicherheit besser, die Verantwortung für die Validierung von Adressen an Google oder Yahoo zu übertragen.

Beide Unternehmen bieten Adressensuchfunktionen über eine programmierbare API.

SingleNegationElimination
quelle
1

Warum machst du das und warum kümmert es dich? Wie Tom Ritter betonte, spielt es keine Rolle, ob Sie überhaupt eine Postleitzahl haben, geschweige denn, ob diese gültig ist oder nicht, bis Sie tatsächlich etwas an diese Adresse senden. Auch wenn Sie erwarten , dass Sie ihnen etwas wird das Senden eines Tages , das bedeutet nicht , dass Sie eine Postleitzahl brauchen heute .

Dave Sherohman
quelle
Ja, aber wenn sie einen eingeben, können Sie auch sicherstellen, dass er zu diesem Zeitpunkt korrekt ist. Ich stimme jedoch einer der anderen Antworten zu, die im Wesentlichen besagen, dass sie für die Länder validiert werden sollen, von denen Sie glauben, dass sie die Mehrheit Ihrer Kunden sein werden.
CDMckay
1
Einige Kredit-Clearingstellen akzeptieren keine Rechnung, es sei denn, die Postleitzahl ist korrekt. Ich würde die Postleitzahl lieber bei der Eingabe validieren, als die Gebühr einzureichen und sie ablehnen zu lassen.
SamGoody
1

Wie an anderer Stelle erwähnt, sind die Unterschiede auf der ganzen Welt enorm. Und selbst wenn etwas, das dem Muster entspricht, nicht bedeutet, dass es existiert.

Dann gibt es natürlich viele Orte, an denen Postleitzahlen nicht verwendet werden (z. B. viel oder Irland).

Richard
quelle
Tatsächlich wird wahrscheinlich ganz Irland, da ich nicht denke, dass D1, D2 usw. als richtige Postleitzahlen angesehen werden, da Sie eine Adresse nicht nur mit diesem Code und einer Hausnummer identifizieren können.
Dónal
1

Es gibt Gründe, die über den Versand hinausgehen und eine genaue Postleitzahl haben. Reisebüros, die grenzüberschreitende Touren durchführen (mit Ausnahme der Eurozone natürlich), benötigen diese Informationen im Voraus, um sie den Behörden zu übermitteln. Oft werden diese Informationen von einem Agenten eingegeben, der mit solchen Dingen vertraut ist oder nicht. JEDE Methode, die Fehler reduzieren kann, ist eine gute Idee ™

Es wäre jedoch verrückt, einen regulären Ausdruck zu schreiben, der alle Postleitzahlen der Welt abdeckt.


quelle
1
Es ist nur eine gute Idee, bis der Code gültige Postleitzahlen ablehnt, entweder weil er fehlerhaft ist oder sich die Postleitzahlen geändert haben. Die Validierung muss entweder richtig oder gar nicht vorhanden sein. Zumindest sollte es eine Override-Option geben.
Chas. Owens
1

Angesichts der Tatsache, dass es für jedes Land so viele Randfälle gibt (z. B. verwenden Londoner Adressen möglicherweise ein etwas anderes Format als der Rest des Vereinigten Königreichs), glaube ich nicht, dass es einen anderen ultimativen regulären Ausdruck gibt als vielleicht:

[0-9a-zA-Z]+

Am besten mit einem ziemlich breiten Muster (auch nicht ganz so breit wie oben) oder mit jedem Land / jeder Region mit einem eigenen Muster!

UPDATE: Es kann jedoch möglich sein, einen regulären Ausdruck dynamisch zu erstellen, der auf vielen kleineren, regionenspezifischen Regeln basiert - obwohl die Leistung nicht sicher ist!

Viele länderspezifische Muster finden Sie auf der RegExLib- Site.

Großer Sprung
quelle
1

Jemand fragte nach der Liste der formatierenden Postanschriften, und ich denke, das ist es, wonach er gesucht hat ...

Franks zwanghafter Leitfaden für Postanschriften: http://www.columbia.edu/~fdc/postal/ Hilft jedoch nicht viel bei Problemen auf Straßenebene.

Meine Arbeit verwendet einige Tools, um dies zu unterstützen: - Lexis-Nexis-Dienste, einschließlich NCOA-Lookups (Sie erhalten die Adressstandardisierung kostenlos "kostenlos") - "Melissa Data" http://www.melissadata.com

user1390375
quelle
1

Dies ist eine sehr einfache RegEx zur Überprüfung der US-Postleitzahl (nicht ZipCode Plus Four):

(?!([089])\1{4})\d{5}

Scheint alle fünfstelligen numerischen gültig zipcodes außer sind 00000, 88888und 99999.

Ich habe diese RegEx mit http://regexpal.com/ getestet.

SP

Som Poddar
quelle
Diese RegEx erzwingt keine vier Ziffern für den Teil zip + 4. Beispielsweise wird "92122-1" als gültige Postleitzahl betrachtet.
Sensei James
0

Wenn Zip CodeZeichen und Ziffern (alphanumerisch) zulässig sind, wird unter dem regulären Ausdruck, wo er übereinstimmt, 5 oder 9 oder 10 alphanumerische Zeichen mit einem Bindestrich ( -) verwendet:

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Vivek Kalekere
quelle