webentwicklung-frage-antwort-db.com.de

RegEx für übereinstimmende Postleitzahlen in Großbritannien

Ich bin nach einem regulären Ausdruck, der eine vollständige komplexe britische Postleitzahl nur innerhalb einer Eingabezeichenfolge validiert. Alle ungewöhnlichen Postleitzahlenformulare müssen wie üblich abgedeckt sein. Zum Beispiel:

Übereinstimmungen

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

Keine Übereinstimmung

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

Wie löse ich dieses Problem?

166
Kieran Benton

Ich würde empfehlen, einen Blick auf den UK Government Data Standard für Postleitzahlen zu werfen [Link jetzt tot; Archiv von XML , siehe Wikipedia zur Diskussion]. Es gibt eine kurze Beschreibung der Daten und das angehängte XML-Schema enthält einen regulären Ausdruck. Es ist vielleicht nicht genau das, was Sie wollen, aber es wäre ein guter Ausgangspunkt. Der RegEx unterscheidet sich geringfügig vom XML-Code, da ein P-Zeichen an dritter Stelle im Format A9A 9AA gemäß der angegebenen Definition zulässig ist.

Die von der britischen Regierung gelieferte RegEx lautete:

([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\s?[0-9][A-Za-z]{2})

Wie in der Wikipedia-Diskussion erwähnt, werden hierdurch einige nicht echte Postleitzahlen (z. B. die mit AA, ZY beginnenden) zugelassen, und es wird ein strengerer Test angeboten, den Sie ausprobieren können.

181
marcj

Es sieht so aus, als würden wir ^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$ verwenden, eine leicht modifizierte Version der von Minglis oben vorgeschlagenen.

Wir müssen jedoch genau untersuchen, wie die Regeln lauten, da die verschiedenen oben aufgeführten Lösungen unterschiedliche Regeln hinsichtlich der zulässigen Buchstaben anzuwenden scheinen.

Nach einigen Recherchen haben wir weitere Informationen gefunden. Anscheinend verweist eine Seite auf 'govtalk.gov.uk' auf eine Postleitzahlangabe govtalk-postcodes . Dies verweist auf ein XML-Schema unter XML Schema , das eine 'Pseudo-Regex'-Anweisung der Postleitzahlenregeln bereitstellt.

Wir haben das genommen und ein wenig daran gearbeitet, um uns den folgenden Ausdruck zu geben:

^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$

Dies macht Leerzeichen optional, beschränkt Sie jedoch auf ein Leerzeichen (ersetzen Sie das '&' durch '{0,} für unbegrenzte Leerzeichen). Es wird angenommen, dass der gesamte Text in Großbuchstaben geschrieben sein muss.

Wenn Sie Kleinbuchstaben mit einer beliebigen Anzahl von Leerzeichen zulassen möchten, verwenden Sie:

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

Dies gilt nicht für Überseegebiete und erzwingt nur das Format, NICHT die Existenz verschiedener Gebiete. Es basiert auf folgenden Regeln:

Kann die folgenden Formate akzeptieren:

  • "GIR 0AA"
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

Woher:

  • 9 kann eine beliebige einstellige Zahl sein.
  • A kann ein beliebiger Buchstabe mit Ausnahme von Q, V oder X sein.
  • B kann jeder Buchstabe außer I, J oder Z sein.
  • C kann jeder Buchstabe außer I, L, M, N, O, P, Q, R, V, X, Y oder Z sein.
  • D kann jeder Buchstabe außer I, J oder Z sein.
  • E kann eines von A, B, E, H, M, N, P, R, V, W, X oder Y sein.
  • Z kann jeder Buchstabe außer C, I, K, M, O oder V sein.

Die besten Wünsche

Colin

81
Colin

Es gibt keinen umfassenden regulären Ausdruck für Postleitzahlen in Großbritannien, der eine Postleitzahl validieren kann. Sie können mithilfe eines regulären Ausdrucks überprüfen, ob die Postleitzahl das richtige Format hat. nicht, dass es tatsächlich existiert.

Postleitzahlen sind beliebig komplex und ändern sich ständig. Zum Beispiel der Outcode W1 hat möglicherweise nicht für jeden Postleitzahlenbereich jede Zahl zwischen 1 und 99.

Sie können nicht erwarten, dass das, was gegenwärtig da ist, für immer wahr ist. Als Beispiel entschied die Post 1990, dass Aberdeen etwas überfüllt war. Sie fügten am Ende von AB1-5 eine 0 hinzu und machten es zu AB10-50. Dann erstellten sie eine Reihe von Postleitzahlen dazwischen.

Immer wenn eine neue Straße gebaut wird, wird eine neue Postleitzahl erstellt. Dies ist Teil des Prozesses zur Erlangung der Baugenehmigung. Die lokalen Behörden sind verpflichtet, dies bei der Post auf dem neuesten Stand zu halten (nicht bei allen).

Darüber hinaus gibt es, wie von einer Reihe anderer Benutzer bemerkt, die speziellen Postleitzahlen wie Girobank, GIR 0AA und die für Briefe an den Weihnachtsmann, SAN TA1 - Sie möchten wahrscheinlich nicht posten alles dort, aber es scheint nicht von einer anderen Antwort abgedeckt zu werden.

Dann gibt es die BFPO-Postleitzahlen, die jetzt in ein Standardformat geändert sind. Beide Formate sind gültig. Schließlich gibt es die überseeischen Gebiete Quelle Wikipedia.

 + ---------- + ----------------------------- ------------- + 
 | Postleitzahl | Ort | 
 + ---------- + ------------------------------- --------------- + 
 | AI-2640 | Anguilla | 
 | ASCN 1ZZ | Ascension Island | 
 | STHL 1ZZ | St. Helena | 
 | TDCU 1ZZ | Tristan da Cunha | 
 | BBND 1ZZ | Britisches Territorium im Indischen Ozean | 
 | BIQQ 1ZZ | Britisches Antarktis-Territorium | 
 | FIQQ 1ZZ | Falklandinseln | 
 | GX11 1AA | Gibraltar | 
 | PCRN 1ZZ | Pitcairninseln | 
 | SIQQ 1ZZ | Südgeorgien und die südlichen Sandwichinseln | 
 | TKCA 1ZZ | Turks- und Caicosinseln | 
 + ---------- + ---------------------------- ------------------ +

Als nächstes müssen Sie berücksichtigen, dass Großbritannien sein Postleitzahlensystem an viele Orte der Welt "exportiert" hat. Alles, was eine "UK" -Postleitzahl validiert, validiert auch die Postleitzahlen einer Reihe anderer Länder.

Wenn Sie eine britische Postleitzahl validieren möchten, ist es am sichersten, die aktuellen Postleitzahlen nachzuschlagen. Es gibt eine Reihe von Optionen:

  • Ordnance Survey veröffentlicht Code-Point Open unter einer Open-Data-Lizenz. Es wird etwas hinter der Zeit liegen, aber es ist kostenlos. Dies wird (wahrscheinlich - ich kann mich nicht erinnern) keine nordirischen Daten enthalten, da die Ordnance Survey dort keinen Auftrag hat. Die Kartierung in Nordirland wird von der Ordnance Survey of Northern Ireland durchgeführt und sie haben ihr separates, kostenpflichtiges Pointer Produkt. Sie können dies verwenden und die wenigen anhängen, die nicht so einfach behandelt werden.

  • Royal Mail veröffentlicht die PLZ-Adressdatei (PAF) , dies schließt BFPO ein, was ich nicht sicher bin, ob Code-Point Open dies tut. Es wird regelmäßig aktualisiert, kostet aber Geld (und manchmal sind sie geradezu gemein). PAF enthält nicht nur die Postleitzahlen, sondern die vollständige Adresse und ein eigenes Programmierhandbuch . Die Open Data User Group (ODUG) setzt sich derzeit dafür ein, dass PAF kostenlos veröffentlicht wird, hier eine Beschreibung ihrer Position .

  • Zuletzt gibt es AddressBase . Hierbei handelt es sich um eine Zusammenarbeit zwischen Ordnance Survey, Local Authorities, Royal Mail und einem entsprechenden Unternehmen, um ein endgültiges Verzeichnis aller Informationen zu allen britischen Adressen zu erstellen (auch sie waren recht erfolgreich). Es ist kostenpflichtig, aber wenn Sie mit einer örtlichen Behörde, einer Regierungsabteilung oder einem Regierungsdienst zusammenarbeiten, können sie es kostenlos nutzen. Es gibt viel mehr Informationen als nur Postleitzahlen.

42
Ben

Ich habe kürzlich eine Antwort bis diese Frage zu Postleitzahlen in Großbritannien für die R-Sprache gepostet. Ich habe festgestellt, dass das Regex-Muster der britischen Regierung nicht korrekt ist und einige Postleitzahlen nicht ordnungsgemäß validiert . Leider basieren viele der Antworten hier auf diesem falschen Muster.

Im Folgenden werden einige dieser Probleme beschrieben und ein überarbeiteter regulärer Ausdruck bereitgestellt, der tatsächlich funktioniert.


Hinweis

Meine Antwort (und reguläre Ausdrücke im Allgemeinen):

  • Validiert nur Postleitzahlenformate .
  • Stellt nicht sicher, dass eine Postleitzahl legitim existiert .
    • Verwenden Sie dazu eine entsprechende API! Siehe Bens Antwort für weitere Informationen.

Wenn Sie sich nicht für die schlechte Regex interessieren und nur zur Antwort springen möchten, scrollen Sie nach unten zur Antwort Abschnitt.

Der schlechte Regex

Die regulären Ausdrücke in diesem Abschnitt sollten nicht verwendet werden.

Dies ist der fehlerhafte reguläre Ausdruck, den die britische Regierung den Entwicklern zur Verfügung gestellt hat (nicht sicher, wie lange dieser Link bestehen wird, aber Sie können ihn in ihrem Bulk Data Transfer documentation ) sehen:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

Probleme

Problem 1 - Kopieren/Einfügen

Siehe Regex hier .

Wie es wahrscheinlich viele Entwickler tun, kopieren sie Code (insbesondere reguläre Ausdrücke) und fügen ihn ein, damit er funktioniert. Theoretisch ist dies zwar großartig, schlägt jedoch in diesem speziellen Fall fehl, da beim Kopieren/Einfügen aus diesem Dokument tatsächlich eines der Zeichen (ein Leerzeichen) in ein Zeilenumbruchzeichen umgewandelt wird, wie unten gezeigt:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))
[0-9][A-Za-z]{2})$

Das Erste, was die meisten Entwickler tun werden, ist, die neue Zeile zu löschen, ohne darüber nachzudenken. Der reguläre Ausdruck vergleicht nun keine Postleitzahlen mit Leerzeichen (außer der Postleitzahl GIR 0AA).

Um dieses Problem zu beheben, sollte das Zeilenumbruchzeichen durch das Leerzeichen ersetzt werden:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                                     ^

Problem 2 - Grenzen

Siehe Regex hier .

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
^^                     ^ ^                                                                                                                                            ^^

Der reguläre Ausdruck der Postleitzahl verankert den regulären Ausdruck nicht ordnungsgemäß. Jeder, der diesen regulären Ausdruck zur Überprüfung von Postleitzahlen verwendet, ist möglicherweise überrascht, wenn ein Wert wie fooA11 1AA Durchkommt. Das liegt daran, dass sie den Anfang der ersten Option und das Ende der zweiten Option (unabhängig voneinander) verankert haben, wie im obigen Regex ausgeführt.

Dies bedeutet, dass ^ (Position am Zeilenanfang wird bestätigt) nur für die erste Option ([Gg][Ii][Rr] 0[Aa]{2}) Funktioniert, sodass die zweite Option alle Zeichenfolgen validiert, die ) ende in einer Postleitzahl (egal was vorher kommt).

Ebenso ist die erste Option nicht am Ende der Zeile $ Verankert, daher wird auch GIR 0AAfoo Akzeptiert.

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

Um dieses Problem zu beheben, sollten beide Optionen in eine andere Gruppe (oder Nicht-Capturing-Gruppe) eingeschlossen und die Anker darum gelegt werden:

^(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$
^^                                                                                                                                                                      ^^

Problem 3 - Falscher Zeichensatz

Siehe Regex hier .

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                       ^^

Der Regex fehlt hier ein -, Um einen Bereich von Zeichen anzugeben. So wie es aussieht, hat eine Postleitzahl das Format ANA NAA (Wobei A einen Buchstaben und N eine Zahl darstellt) und beginnt mit etwas anderem als A oder Z, es wird fehlschlagen.

Das bedeutet, dass es mit A1A 1AA Und Z1A 1AA Übereinstimmt, aber nicht mit B1A 1AA.

Um dieses Problem zu beheben, sollte das Zeichen - Im jeweiligen Zeichensatz zwischen A und Z stehen:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                        ^

Problem 4 - Falscher optionaler Zeichensatz

Siehe Regex hier .

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                        ^

Ich schwöre, dass sie dieses Ding nicht einmal getestet haben, bevor sie es im Web veröffentlicht haben. Sie haben den falschen Zeichensatz optional gemacht. Sie machten die Option [0-9] In der vierten Unteroption von Option 2 (Gruppe 9). Dadurch kann der reguläre Ausdruck mit falsch formatierten Postleitzahlen wie AAA 1AA Übereinstimmen.

Um dieses Problem zu beheben, machen Sie stattdessen die nächste Zeichenklasse optional (und stellen Sie anschließend sicher, dass die Menge [0-9] Genau einmal übereinstimmt):

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?)))) [0-9][A-Za-z]{2})$
                                                                                                                                                ^

Problem 5 - Leistung

Die Leistung auf diesem Regex ist extrem schlecht. Zunächst platzierten sie die am wenigsten wahrscheinliche Musteroption, die mit GIR 0AA Am Anfang übereinstimmt. Wie viele Benutzer haben diese Postleitzahl wahrscheinlich im Vergleich zu anderen Postleitzahlen? wahrscheinlich nie? Dies bedeutet, dass jedes Mal, wenn der reguläre Ausdruck verwendet wird, diese Option zuerst erschöpft werden muss, bevor mit der nächsten Option fortgefahren werden kann. Um zu sehen, wie die Leistung beeinträchtigt wird, überprüfen Sie die Anzahl der Schritte, die Original-Regex ausgeführt hat (35), gegen Gleiche Regex, nachdem Sie die Optionen gewechselt haben (22).

Das zweite Problem mit der Leistung ist auf die Art und Weise zurückzuführen, wie der gesamte reguläre Ausdruck strukturiert ist. Es macht keinen Sinn, jede Option zurückzuverfolgen, wenn eine fehlschlägt. Die Struktur des aktuellen regulären Ausdrucks kann erheblich vereinfacht werden. Im Abschnitt Antwort stelle ich eine Lösung dafür bereit.

Aufgabe 6 - Räume

Siehe Regex hier

Dies ist möglicherweise kein Problem an sich, wirft jedoch bei den meisten Entwicklern Bedenken auf. Die Leerzeichen im regulären Ausdruck sind nicht optional. Das bedeutet, dass die Benutzer, die ihre Postleitzahlen eingeben, ein Leerzeichen in der Postleitzahl einfügen müssen. Dies ist eine einfache Lösung, indem Sie einfach ? Nach den Leerzeichen einfügen, um sie optional darzustellen. Eine Lösung finden Sie im Abschnitt Antwort .


Antworten

1. Festsetzung des Regex der britischen Regierung

Wenn Sie alle im Abschnitt Probleme beschriebenen Probleme beheben und das Muster vereinfachen, erhalten Sie das folgende, kürzere und präzisere Muster. Wir können auch die meisten Gruppen entfernen, da wir die Postleitzahl als Ganzes validieren (nicht einzelne Teile):

Siehe Regex hier

^([A-Za-z][A-Ha-hJ-Yj-y]?[0-9][A-Za-z0-9]? ?[0-9][A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$

Dies kann weiter verkürzt werden, indem alle Bereiche aus einem der Fälle (Groß- oder Kleinschreibung) entfernt und ein Flag verwendet wird, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird. Hinweis : Einige Sprachen haben keine, verwenden Sie also die längere oben. Jede Sprache implementiert das Flag für Groß- und Kleinschreibung unterschiedlich.

Siehe Regex hier .

^([A-Z][A-HJ-Y]?[0-9][A-Z0-9]? ?[0-9][A-Z]{2}|GIR ?0A{2})$

Kürzere Ersetzung von [0-9] Durch \d (Falls Ihre Regex-Engine dies unterstützt):

Siehe Regex hier .

^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

2. Vereinfachte Muster

Ohne bestimmte alphabetische Zeichen zu gewährleisten, können die folgenden verwendet werden (beachten Sie die Vereinfachungen aus 1. Die Regex-Korrektur der britischen Regierung wurde auch hier angewendet):

Siehe Regex hier .

^([A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

Und noch weiter, wenn Sie sich nicht für den Sonderfall interessieren GIR 0AA:

^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$

3. Komplizierte Muster

Ich würde keine Überbestätigung einer Postleitzahl vorschlagen, da neue Gebiete, Bezirke und Unterbezirke zu jedem Zeitpunkt erscheinen können. Was ich möglicherweise vorschlagen werde, ist die Unterstützung für Edge-Cases. Es gibt einige Sonderfälle, die in dieser Wikipedia-Artikel beschrieben sind.

Hier sind komplexe reguläre Ausdrücke, die die Unterabschnitte von 3. (3.1, 3.2, 3.3) enthalten.

In Bezug auf die Muster in 1. Festsetzung des Regex der britischen Regierung :

Siehe Regex hier

^(([A-Z][A-HJ-Y]?\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

Und in Bezug auf 2. Vereinfachte Muster :

Siehe Regex hier

^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

3.1 Britische Überseegebiete

In dem Wikipedia-Artikel heißt es derzeit (einige Formate leicht vereinfacht):

  • AI-1111: Anguila
  • ASCN 1ZZ: Ascension Island
  • STHL 1ZZ: St. Helena
  • TDCU 1ZZ: Tristan da Cunha
  • BBND 1ZZ: Britisches Territorium im Indischen Ozean
  • BIQQ 1ZZ: Britisches Antarktis-Territorium
  • FIQQ 1ZZ: Falklandinseln
  • GX11 1ZZ: Gibraltar
  • PCRN 1ZZ: Pitcairninseln
  • SIQQ 1ZZ: Südgeorgien und die Südlichen Sandwichinseln
  • TKCA 1ZZ: Turks- und Caicosinseln
  • BFPO 11: Akrotiri und Dhekelia
  • ZZ 11 & GE CX: Bermuda (gemäß dieses Dokument )
  • KY1-1111: Cayman Islands (laut dieses Dokument )
  • VG1111: Britische Jungferninseln (gemäß dieses Dokument )
  • MSR 1111: Montserrat (gemäß dieses Dokument )

Ein umfassender regulärer Ausdruck, der nur den britischen Überseegebieten entspricht, könnte folgendermaßen aussehen:

Siehe Regex hier .

^((ASCN|STHL|TDCU|BBND|[BFS]IQQ|GX\d{2}|PCRN|TKCA) ?\d[A-Z]{2}|(KY\d|MSR|VG|AI)[ -]?\d{4}|(BFPO|[A-Z]{2}) ?\d{2}|GE ?CX)$

3.2 Post der britischen Streitkräfte

Obwohl sie kürzlich geändert wurden, um eine bessere Anpassung an das britische Postleitzahlensystem zu BF# (Wobei # Eine Zahl darstellt), werden sie als optionale alternative Postleitzahlen betrachtet . Diese Postleitzahlen folgen dem Format von BFPO, gefolgt von 1-4 Ziffern:

Siehe Regex hier

^BFPO ?\d{1,4}$

3.3 Weihnachtsmann?

Es gibt einen weiteren Sonderfall bei Santa (wie in anderen Antworten erwähnt): SAN TA1 Ist eine gültige Postleitzahl. Ein regulärer Ausdruck dafür ist ganz einfach:

^SAN ?TA1$
35
ctwheels

Ich habe mir einige der obigen Antworten angesehen und empfehle, das Muster aus @ Dans Antwort (ca. 15. Dezember 10) nicht zu verwenden, da es fälschlicherweise fast 0,4 anzeigt % der gültigen Postleitzahlen sind ungültig, die anderen nicht.

Ordnance Survey bietet einen Service namens Code Point Open an, der:

enthält eine Liste aller aktuellen PLZ-Einheiten in Großbritannien

Ich habe jeden der oben genannten regulären Ausdrücke anhand der vollständigen Liste der Postleitzahlen (6. Juli 13) aus diesen Daten mit grep abgeglichen:

cat CSV/*.csv |
    # Strip leading quotes
    sed -e 's/^"//g' |
    # Strip trailing quote and everything after it
    sed -e 's/".*//g' |
    # Strip any spaces
    sed -E -e 's/ +//g' |
    # Find any lines that do not match the expression
    grep --invert-match --Perl-regexp "$pattern"

Es gibt insgesamt 1.686.202 Postleitzahlen.

Im Folgenden sind die Nummern der gültigen Postleitzahlen aufgeführt, die nicht ​​mit jedem $pattern Übereinstimmen:

'^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$'
# => 6016 (0.36%)
'^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$'
# => 0
'^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}$'
# => 0

Diese Ergebnisse beziehen sich natürlich nur auf gültige Postleitzahlen, die fälschlicherweise als ungültig gekennzeichnet sind. So:

'^.*$'
# => 0

Ich sage nichts darüber, welches Muster das beste ist, um ungültige Postleitzahlen herauszufiltern.

20
RichardTowers
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

Regulärer Ausdruck für gültige Postleitzahlen in Großbritannien. Im britischen Postsystem werden nicht alle Buchstaben in allen Positionen verwendet (das gleiche gilt für Kfz-Kennzeichen), und es gibt verschiedene Regeln, um dies zu regeln. Dieser reguläre Ausdruck berücksichtigt diese Regeln. Einzelheiten der Regeln: Erste Hälfte der Postleitzahl Gültige Formate [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [0-9] [0-9] [AZ] [0-9] [ 0-9] [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [AZ] [0-9] [AZ] [AZ] [0-9] Ausnahmen Position - Zuerst. Contraint - QVX wird nicht verwendet Position - Second. Contraint - IJZ nicht verwendet, außer in GIR 0AA Position - Third. Einschränkung - AEHMNPRTVXY verwendet nur Position - Forth. Contraint - ABEHMNPRVWXY Zweite Hälfte der Postleitzahl Gültige Formate [0-9] [A-Z] [A-Z] Ausnahmen Position - Zweite und Dritte. Contraint - CIKMOV wird nicht verwendet

http://regexlib.com/REDetails.aspx?regexp_id=26

17
Dan

Die meisten Antworten funktionierten hier nicht für alle Postleitzahlen, die ich in meiner Datenbank habe. Endlich habe ich eine gefunden, die mit allen validiert, und zwar unter Verwendung der neuen, von der Regierung bereitgestellten Regex:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf

Es ist nicht in einer der vorherigen Antworten, also poste ich es hier, falls sie den Link aufheben:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

UPDATE: Regex aktualisiert, wie von Jamie Bull gezeigt. Ich bin mir nicht sicher, ob es mein Fehler beim Kopieren war oder ob es ein Fehler in der Regex der Regierung war. Der Link ist jetzt ausgefallen.

UPDATE: Wie ctwheels herausgefunden hat, arbeitet dieser Regex mit der Javascript-Regex-Variante. Siehe seinen Kommentar für einen, der mit dem pcre (php) -Geschmack arbeitet.

14
Jesús Carrera

Nach dieser Wikipedia-Tabelle

enter image description here

Dieses Muster deckt alle Fälle ab

(?:[A-Za-z]\d ?\d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z\d]\d ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d{2} ?\d[A-Za-z]{2})|(?:[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d[A-Za-z] ?\d[A-Za-z]{2})

Wenn Sie es unter Android\Java verwenden, verwenden Sie \\ d

12
AntPachon

Ein alter Beitrag, aber immer noch ziemlich hoch in den Google-Ergebnissen, also dachte ich, ich würde ihn aktualisieren. In diesem Dokument vom 14. Oktober wird der reguläre Ausdruck für die Postleitzahl in Großbritannien wie folgt definiert:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([**AZ**a-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

von:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf

Das Dokument erklärt auch die Logik dahinter. Es hat jedoch einen Fehler (fett gedruckt) und erlaubt auch Kleinbuchstaben, was, obwohl legal, nicht üblich ist, so abgeänderte Version:

^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$

Dies funktioniert mit neuen Londoner Postleitzahlen (z. B. W1D 5LH), die in früheren Versionen nicht verfügbar waren.

12
deadcrab

Dies ist der reguläre Ausdruck, den Google auf seiner i18napis.appspot.com -Domain anbietet:

GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}
10
Alix Axel

Postleitzahlen können sich ändern, und die einzige Möglichkeit, eine Postleitzahl zu validieren, besteht darin, die vollständige Liste der Postleitzahlen zu haben und zu prüfen, ob sie dort vorhanden sind.

Aber reguläre Ausdrücke sind nützlich, weil sie:

  • sind einfach zu bedienen und zu implementieren
  • sind kurz
  • sind schnell zu rennen
  • sind recht pflegeleicht (im Vergleich zu einer vollständigen Liste von Postleitzahlen)
  • fangen immer noch die meisten Eingabefehler

Aber reguläre Ausdrücke sind in der Regel schwierig zu pflegen, insbesondere für jemanden, der sie gar nicht erst gefunden hat. So muss es sein:

  • so einfach wie möglich zu verstehen
  • relativ zukunftssicher

Das bedeutet, dass die meisten regulären Ausdrücke in dieser Antwort nicht gut genug sind. Z.B. Ich kann sehen, dass [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] wird mit einem Postleitzahlenbereich der Form AA1A übereinstimmen - aber es wird ärgerlich, wenn ein neuer Postleitzahlenbereich hinzugefügt wird, da schwer zu verstehen ist, mit welchen Postleitzahlenbereichen er übereinstimmt.

Ich möchte auch, dass mein regulärer Ausdruck mit der ersten und zweiten Hälfte der Postleitzahl in Klammern übereinstimmt.

Also habe ich mir Folgendes ausgedacht:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})

Im PCRE-Format kann es wie folgt geschrieben werden:

/^
  ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
    |
    (?:
      [BEGLMNSW] | # There are 8 single-letter postcode areas
      [A-Z]{2}     # All other postcode areas have two letters
      )
    [0-9] # There is always at least one number after the postcode area
    (?:
      [0-9] # And an optional extra number
      |
      # Only certain postcode areas can have an extra letter after the number
      (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
      [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
      )?
    )
  \s*
  ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x

Für mich ist dies die richtige Balance zwischen größtmöglicher Validierung bei gleichzeitiger Zukunftssicherheit und einfacher Wartung.

10
andre

Ich habe für den letzten Tag oder so nach einer Postleitzahl in Großbritannien gesucht und bin über diesen Thread gestolpert. Ich habe die meisten der oben genannten Vorschläge durchgearbeitet, und keiner von ihnen hat für mich funktioniert. Deshalb habe ich mir einen eigenen regulären Ausdruck ausgedacht, der meines Wissens alle gültigen Postleitzahlen in Großbritannien ab dem 13. Januar erfasst (gemäß der neuesten Literatur von die Königliche Post).

Der reguläre Ausdruck und einige einfache Postleitzahlenprüfungen PHP= Code ist unten angegeben. HINWEIS: - Ermöglicht Groß - oder Kleinbuchstaben und die GIR 0AA - Anomalie, kann jedoch mit der höchstwahrscheinlichen Anwesenheit von a umgehen Leerzeichen in der Mitte einer eingegebenen Postleitzahl können Sie auch mit einem einfachen str_replace das Leerzeichen entfernen, bevor Sie die Regex testen. Darüber hinausgehende Unstimmigkeiten und die Royal Mail selbst erwähnen sie nicht einmal in ihrer Literatur (siehe http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf und lesen Sie ab Seite 17)!

Hinweis: In der Royal Mail-eigenen Literatur (Link oben) gibt es eine leichte Unklarheit in Bezug auf die 3. und 4. Position und die Ausnahmen, wenn diese Zeichen vorhanden sind Briefe. Ich habe Royal Mail direkt kontaktiert, um es zu klären und in ihren eigenen Worten: "Ein Brief an der vierten Stelle des Auslandscodes mit dem Format AANA NAA hat keine Ausnahmen, und die Ausnahmen an der dritten Stelle gelten nur für den letzten Buchstaben des Auslandscodes mit dem Format ANA NAA. " Direkt aus dem Maul des Pferdes!

<?php

    $postcoderegex = '/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][a-z]{1}))(\d[abd-hjlnp-uw-z]{2})?)$/i';

    $postcode2check = str_replace(' ','',$postcode2check);

    if (preg_match($postcoderegex, $postcode2check)) {

        echo "$postcode2check is a valid postcode<br>";

    } else {

        echo "$postcode2check is not a valid postcode<br>";

    }

?>

Ich hoffe es hilft jedem anderen, der auf diesen Thread stößt und nach einer Lösung sucht.

9
Dan Solo

Hier ist ein regulärer Ausdruck, der auf dem Format basiert, das in den Dokumenten angegeben ist, die mit der Antwort von marcj verknüpft sind:

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}$/

Der einzige Unterschied zu den Spezifikationen besteht darin, dass die letzten beiden Zeichen gemäß den Spezifikationen nicht in [CIKMOV] enthalten sein können.

Bearbeiten: Hier ist eine andere Version, die die Beschränkungen für nachfolgende Zeichen testet.

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/
7
Will Tomlins

Einige der oben genannten regulären Ausdrücke sind etwas restriktiv. Beachten Sie die Original-Postleitzahl: "W1K 7AA" würde aufgrund der oben genannten Regel "Position 3 - AEHMNPRTVXY only" fehlschlagen, da "K" nicht zulässig wäre.

der Regex:

^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$

Scheint etwas genauer zu sein, siehe Wikipedia-Artikel mit dem Titel 'Postleitzahlen in Großbritannien' .

Beachten Sie, dass für diesen Ausdruck nur Großbuchstaben erforderlich sind.

Die größere Frage ist, ob Sie die Benutzereingabe einschränken, um nur tatsächlich vorhandene Postleitzahlen zuzulassen, oder ob Sie einfach versuchen, Benutzer davon abzuhalten, vollständigen Müll in die Formularfelder einzugeben. Es ist ein schwierigeres Rätsel, jede mögliche Postleitzahl richtig zuzuordnen und sie für die Zukunft zu prüfen, und es lohnt sich wahrscheinlich nicht, es sei denn, Sie sind HMRC.

5
minglis

Ich verwende den folgenden regulären Ausdruck, den ich mit allen gültigen Postleitzahlen in Großbritannien getestet habe. Es basiert auf den empfohlenen Regeln, ist jedoch so weit wie möglich komprimiert und verwendet keine speziellen sprachspezifischen Regex-Regeln.

([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})

Es wird davon ausgegangen, dass die Postleitzahl in Großbuchstaben konvertiert wurde und keine führenden oder nachfolgenden Zeichen enthält, jedoch ein optionales Leerzeichen zwischen dem Outcode und dem Incode akzeptiert.

Die spezielle Postleitzahl "GIR0 0AA" ist ausgeschlossen und wird nicht validiert, da sie nicht in der offiziellen Postleitzahlenliste der Post enthalten ist und meines Wissens nicht als registrierte Adresse verwendet wird. Das Hinzufügen sollte als Sonderfall bei Bedarf trivial sein.

4
Chisel

Grundregeln:

^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$

Postleitzahlen in Großbritannien (oder Postleitzahlen, wie sie genannt werden) bestehen aus fünf bis sieben alphanumerischen Zeichen, die durch ein Leerzeichen voneinander getrennt sind. Die Regeln, welche Zeichen an bestimmten Positionen vorkommen dürfen, sind recht kompliziert und mit Ausnahmen behaftet. Der gerade gezeigte reguläre Ausdruck hält sich daher an die Grundregeln.

Vollständige Regeln:

Wenn Sie einen regulären Ausdruck benötigen, der auf Kosten der Lesbarkeit alle Kästchen für die Postleitzahlenregeln ankreuzt, gehen Sie wie folgt vor:

^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$

Quelle: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

Getestet gegen unsere Kundendatenbank und scheint vollkommen genau zu sein.

4
Raphos

so haben wir mit dem Problem der britischen Postleitzahl umgegangen:

^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$

Erklärung:

  • erwarten Sie 1 oder 2 a-z Zeichen, obere oder untere feine
  • erwarten Sie 1 oder 2 Zahlen
  • erwarten Sie 0 oder 1 AZ-Zeichen, obere oder untere Geldstrafe
  • optionaler Platz erlaubt
  • erwarte 1 Nummer
  • erwarten Sie 2 a-z, obere oder untere Geldstrafe

Für die meisten Formate verwenden wir dann die Datenbank, um zu überprüfen, ob die Postleitzahl tatsächlich echt ist. Diese Daten werden von openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html gesteuert

hoffe das hilft

3
Alex Stephens

Diese Option lässt Leerzeichen und Tabulatoren von beiden Seiten zu, falls die Validierung nicht fehlschlagen soll, und schneidet sie dann auf beiden Seiten ab.

^\s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})\s*$)
3

Erste Hälfte der Postleitzahl Gültige Formate

  • [AZ] [AZ] [0-9] [AZ]
  • [AZ] [AZ] [0-9] [0-9]
  • [A-Z] [0-9] [0-9]
  • [AZ] [AZ] [0-9]
  • [AZ] [AZ] [AZ]
  • [AZ] [0-9] [AZ]
  • [AZ] [0-9]

Ausnahmen
Position 1 - QVX wird nicht verwendet
Position 2 - IJZ wird nur in GIR 0AA verwendet
Position 3 - Nur AEHMNPRTVXY verwendet
Position 4 - ABEHMNPRVWXY

Zweite Hälfte der Postleitzahl

  • [0-9] [AZ] [AZ]

Ausnahmen
Position 2 + 3 - CIKMOV nicht verwendet

Denken Sie daran, dass nicht alle möglichen Codes verwendet werden. Daher ist diese Liste eine notwendige, aber nicht ausreichende Bedingung für einen gültigen Code. Es könnte einfacher sein, nur eine Liste aller gültigen Codes abzugleichen?

3
Martin Beckett

Um zu überprüfen, eine Postleitzahl ist in einem gültigen Format nach der Royal Mail Programmieranleitung :

          |----------------------------outward code------------------------------| |------inward code-----|
#special↓       α1        α2    AAN  AANA      AANN      AN    ANN    ANA (α3)        N         AA
^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$

Alle Postleitzahlen auf doogal.co.uk stimmen überein, mit Ausnahme derjenigen, die nicht mehr verwendet werden.

Fügen Sie nach dem Leerzeichen ein ? Hinzu und verwenden Sie die Groß-/Kleinschreibung, um diese Frage zu beantworten:

'se50eg'.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig);
Array [ "se50eg" ]
3
Jackson Pauls

Ich wollte einen einfachen regulären Ausdruck, bei dem es in Ordnung ist, zu viel zuzulassen, aber keine gültige Postleitzahl abzulehnen. Ich ging mit diesem (die Eingabe ist eine gestrippte/getrimmte Zeichenfolge):

/^([a-z0-9]\s*){5,7}$/i

Längen von 5 bis 7 (ohne Leerzeichen) bedeuten, dass wir die kürzestmöglichen Postleitzahlen wie "L1 8JQ" sowie die längsten wie "OL14 5ET" zulassen.

BEARBEITEN: Die 8 wurde in eine 7 geändert, sodass keine 8-stelligen Postleitzahlen zulässig sind.

3
Henrik N

Um dieser Liste einen praktischeren Ausdruck hinzuzufügen, den ich verwende, der es dem Benutzer ermöglicht, ein empty string ist:

^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

Diese Regex erlaubt Groß- und Kleinschreibung mit einem optionalen Leerzeichen dazwischen

Aus Sicht der Softwareentwickler ist dieser reguläre Ausdruck nützlich für Software, bei der eine Adresse optional sein kann. Zum Beispiel, wenn ein Benutzer seine Adressdaten nicht angeben wollte

2
user1

Schauen Sie sich den python Code auf dieser Seite an:

http://www.brunningonline.net/simon/blog/archives/001292.html

Ich habe einige PLZ-Parsing zu tun. Die Anforderung ist ziemlich einfach; Ich muss eine Postleitzahl in einen Outcode und einen (optionalen) Incode umwandeln. Das Gute daran ist, dass ich keine Validierung durchführen muss - ich muss nur auf eine vage intelligente Art und Weise zerhacken, was mir zur Verfügung gestellt wurde. Ich kann nicht viel über meinen Import in Bezug auf Formatierung, d. H. Groß- und Kleinschreibung und eingebettete Leerzeichen, annehmen. Aber das sind keine schlechten Nachrichten. Die schlechte Nachricht ist, dass ich alles in RPG machen muss. :-(

Trotzdem habe ich eine kleine Python Funktion zusammengelegt, um mein Denken zu klären.

Ich habe es verwendet, um Postleitzahlen für mich zu verarbeiten.

1
Rudiger Wolf

Die akzeptierte Antwort entspricht den von Royal Mail vorgegebenen Regeln, obwohl der reguläre Ausdruck einen Tippfehler enthält. Dieser Tippfehler scheint auch auf der Website gov.uk (wie auch auf der XML-Archivseite) vorhanden zu sein.

Im Format A9A 9AA erlauben die Regeln ein P-Zeichen an dritter Stelle, während die Regex dies nicht erlaubt. Der richtige reguläre Ausdruck wäre:

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

Wenn Sie dies kürzen, wird der folgende reguläre Ausdruck verwendet (der die Perl/Ruby-Syntax verwendet):

(GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))\s?[0-9][ABD-HJLNP-UW-Z]{2})

Es enthält auch einen optionalen Abstand zwischen dem ersten und dem zweiten Block.

1
Stieb

Was ich in fast allen Variationen und der Regex aus dem Bulk-Transfer-PDF gefunden habe und was auf der Wikipedia-Site steht, ist, dass es speziell für die Wikipedia-Regex ein ^ nach dem ersten | (vertikaler Balken) geben muss. Ich habe dies durch Testen auf AA9A 9AA herausgefunden, da die Formatprüfung für A9A 9AA dies sonst validiert. Zum Beispiel wird die Überprüfung für EC1D 1BB, die ungültig sein sollte, als gültig zurückgegeben, da C1D 1BB ein gültiges Format ist.

Folgendes habe ich mir für einen guten Regex ausgedacht:

^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$
1
Andrew Schliewe

Wir erhielten eine Spezifikation:

UK Postleitzahlen müssen in einer der folgenden Formen vorliegen (mit einer Ausnahme, siehe unten): 
 § A9 9AA 
 § A99 9AA 
 § AA9 9AA 
 § AA99 9AA 
 § A9A 9AA 
 § AA9A 9AA 
 Wobei A ein alphabetisches Zeichen und 9 ein numerisches Zeichen darstellt. 
 Zusätzliche Regeln gelten für alphabetische Zeichen wie folgt: 
 § Das Zeichen in Position 1 darf nicht Q, V oder X sein 
 § Das Zeichen in Position 2 darf nicht I, J oder Z sein 
 § Das Zeichen in Position 3 darf nicht nicht ich, L, M, N, O, P, Q, R, V, X, Y oder Z sein. 
 § Das Zeichen in Position 4 darf nicht C, D, F, G, I, J sein , K, L, O, Q, S, T, U oder Z 
 § Die Zeichen an den beiden äußersten rechten Stellen dürfen nicht C, I, K, M, O oder V 
 Sein Eine Ausnahme, die diesen allgemeinen Regeln nicht entspricht, ist die Postleitzahl "GIR 0AA", bei der es sich um eine besonders gültige Postleitzahl handelt.

Das haben wir uns ausgedacht:

/^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?\s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR\s*0AA)$/i

Beachten Sie jedoch, dass zwischen den Gruppen beliebig viele Leerzeichen eingefügt werden können.

1
paulslater19

Ich habe den regulären Ausdruck für die Validierung der Postleitzahl in Großbritannien.

Dies funktioniert für alle Arten von Postleitzahlen (innen oder außen)

^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$

Dies funktioniert für alle Arten von Formaten.

Beispiel:

AB10 --------------------> NUR AUSSERHALB DES POSTCODES

A1 1AA ------------------> KOMBINATION VON (AUSSEN- UND INNEN-) POSTCODE

WC2A --------------------> AUSSEN

1
Swift-Master

Die folgende Methode überprüft die Postleitzahl und gibt vollständige Informationen an

const valid_postcode = postcode => {
    try {
        postcode = postcode.replace(/\s/g, "");
        const fromat = postcode
            .toUpperCase()
            .match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
        const finalValue = `${fromat[1]} ${fromat[2]}`;
        const regex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$/i;
        return {
            isValid: regex.test(postcode),
            formatedPostCode: finalValue,
            error: false,
            info: 'It is a valid postcode'
        };
    } catch (error) {
        return { error: true , info: 'Invalid post code has been entered!'};
    }
};
valid_postcode('GU348RR')
result => {isValid: true, formatedPostCode: "GU34 8RR", error: false, info: "It is a valid postcode"}
valid_postcode('sdasd4746asd')
result => {error: true, info: "Invalid post code has been entered!"}
valid_postcode('787898523')
result => {error: true, info: "Invalid post code has been entered!"}
0
Aathi

Ich brauchte eine Version, die in SAS mit dem PRXMATCH und verwandten Funktionen funktionieren würde, also kam ich auf diese Idee:

^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$

Testfälle und Hinweise:

/* 
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/

/*
    Bits and pieces
    1st position (any):         [A-PR-UWYZ]         
    2nd position (if letter):   [A-HK-Y]
    3rd position (A1A format):  [A-HJKPSTUW]
    4th position (AA1A format): [ABEHMNPRV-Y]
    Last 2 positions:           [ABD-HJLNP-UW-Z]    
*/


data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
cards;
1  EC1A 1BB  Special case 1
1  W1A 0AX   Special case 2
1  M1 1AE    Standard format
1  B33 8TH   Standard format
1  CR2 6XH   Standard format
1  DN55 1PT  Standard format
0  QN55 1PT  Bad letter in 1st position
0  DI55 1PT  Bad letter in 2nd position
0  W1Z 0AX   Bad letter in 3rd position
0  EC1Z 1BB  Bad letter in 4th position
0  DN55 1CT  Bad letter in 2nd group
0  A11A 1AA  Invalid digits in 1st group
0  AA11A 1AA  1st group too long
0  AA11 1AAA  2nd group too long
0  AA11 1AAA  2nd group too long
0  AAA 1AA   No digit in 1st group
0  AA 1AA    No digit in 1st group
0  A 1AA     No digit in 1st group
0  1A 1AA    Missing letter in 1st group
0  1 1AA     Missing letter in 1st group
0  11 1AA    Missing letter in 1st group
0  AA1 1A    Missing letter in 2nd group
0  AA1 1     Missing letter in 2nd group
;
run;
0
user667489

Ich habe dies aus einem XML-Dokument gestohlen und es scheint alle Fälle ohne den fest codierten GIRO abzudecken:

%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(Ruby-Syntax mit Groß- und Kleinschreibung ignorieren)

0
Ghoti