Frage

Ich bin nach einem regulären Ausdruck, dass ein vollständig komplex UK Postleitzahl nur innerhalb einer Eingabezeichenfolge validieren. Alle der ungewöhnlichen Postleitzahl Formulare müssen, sowie die üblichen abgedeckt werden. Zum Beispiel:

Spiele

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

Kein Spiel

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

Wie kann ich dieses Problem lösen?

War es hilfreich?

Lösung

Ich würde empfehlen, einen Blick auf die britische Regierung Daten Standard für Postleitzahlen [Link nun tot nehmen; Archiv von XML finden Sie unter Wikipedia zur Diskussion]. Es gibt eine kurze Beschreibung über die Daten und das angeschlossene XML-Schema stellt einen regulären Ausdruck. Es ist vielleicht nicht genau das, was Sie wollen, aber wäre ein guter Ausgangspunkt sein. Die RegEx unterscheidet sich von der XML leicht, als ein P-Zeichen in dritte Position im Format A9A 9AA von der Definition erlaubt ist.

Die RegEx von der britischen Regierung geliefert wurde:

([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 auf der Wikipedia Diskussion darauf hingewiesen, dies wird einige nicht-real Postleitzahlen ermöglichen (zum Beispiel diejenigen, beginnend AA, ZY) und sie bietet einen strengeren Test die Sie könnten versuchen.

Andere Tipps

Es sieht aus wie wir sein mit ^(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})$ gehen, die eine leicht modifizierte Version davon durch Minglis oben sugested ist.

Allerdings werden wir genau zu untersuchen, haben, was die Regeln sind, wie die verschiedenen oben aufgeführten Lösungen scheinen andere Regeln gelten, auf die Buchstaben erlaubt sind.

Nach einigen Recherchen haben wir einige weitere Informationen zu finden. Offenbar eine Seite auf ‚govtalk.gov.uk‘ verweist Sie auf eine Postleitzahl Spezifikation govtalk-Postleitzahlen . Dies deutet auf ein XML-Schema unter XML Schema der vorsieht eine 'Pseudo-regex' Erklärung der Postleitzahl Regeln.

Wir haben das genommen und bearbeitet es ein wenig 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}))$

Das macht Räume optional, aber macht Sie auf einen Raum beschränken (ersetzen das ‚&‘ mit ‚{0,} für eine unbegrenzte Anzahl Leerzeichen). Es übernimmt alle Text muss in Großbuchstaben sein.

Wenn Sie Kleinbuchstaben zulassen wollen, mit einer beliebigen Anzahl von Räumen verwenden:

^(([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 von verschiedenen Bereichen. Es basiert auf den folgenden Regeln:

kann die folgenden Formate annehmen:

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

Dabei gilt:

  • 9 kann jede einzelne Ziffer Zahl sein.
  • A jeden Buchstaben mit Ausnahme von Q, V oder X sein kann.
  • B können jeden Buchstaben sein, außer für I, J oder Z.
  • C kann eine beliebige Buchstabe sein, außer für I, L, M, N, O, P, Q, R, V, X, Y oder Z.
  • D jeden Buchstaben mit Ausnahme von I, J oder Z sein kann.
  • E kann eine beliebige von A, B, E, H, M, N, P, R, V, W, X oder Y sein.
  • Z können jeden Buchstaben sein, außer für C, I, K, M, O oder V.

Die besten Wünsche

Colin

Es gibt nicht so etwas wie eine umfassende UK Postleitzahl regulären Ausdruck, der fähig ist, Validieren Postleitzahl. Sie können prüfen, ob eine Postleitzahl in das richtige Format ist ein regulärer Ausdruck verwendet wird; nicht, dass es existiert.

Postleitzahlen sind beliebig komplex und ändert sich ständig. Zum Beispiel funktioniert der outcode W1 nicht und kann nie hat jede Zahl zwischen 1 und 99, für jeden Postleitzahl-Bereich.

Sie können nicht erwarten, was es derzeit immer um wahr zu sein. Als Beispiel entschied sich die Post im Jahr 1990, dass Aberdeen ein wenig überfüllt war immer. Sie fügten hinzu, ein 0 bis zum Ende des AB1-5 es macht AB10-50 und erstellt dann eine Reihe von Postleitzahlen zwischen diesen.

Jedes Mal, wenn eine neue Straße ist eine neue Postleitzahl bauen erstellt. Es ist Teil des Prozesses für die Erlaubnis zu bauen zu erhalten; Kommunen sind verpflichtet, diese mit der Post auf dem Laufenden zu halten (nicht, dass sie alle tun).

Darüber hinaus, wie durch eine Reihe anderer Benutzer bemerkt, gibt es die speziellen Postleitzahlen wie Girobank, GIR 0AA, und dem für Briefe nach Santa, SAN TA1 - Sie wollen wahrscheinlich nicht dort nichts posten, aber es doesn‘ t erscheint durch eine andere Antwort abgedeckt werden.

Dann gibt es die BFPO Postleitzahlen, die jetzt Wechsel zu eine Standardformat . Beide Formate werden gültig sein. Schließlich gibt es in den überseeischen Territorien Quelle Wikipedia .

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| ASCN 1ZZ | Ascension Island                             |
| STHL 1ZZ | Saint Helena                                 |
| TDCU 1ZZ | Tristan da Cunha                             |
| BBND 1ZZ | British Indian Ocean Territory               |
| BIQQ 1ZZ | British Antarctic Territory                  |
| FIQQ 1ZZ | Falkland Islands                             |
| GX11 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

Als nächstes müssen Sie berücksichtigen, dass die britischen „exportiert“ sein Postleitzahlensystem an viele Orte in der Welt. Alles, was ein „UK“ Postleitzahl validiert wird auch die Postleitzahlen von einer Reihe von anderen Ländern überprüfen.

Wenn Sie validate ein UK Postleitzahl die sicherste Art und Weise zu wollen, es zu tun ist, eine Nachschau aktueller Postleitzahlen zu verwenden. Es gibt eine Reihe von Optionen:

Ich gab vor kurzem eine Antwort diese Frage auf Postleitzahlen in Großbritannien für die R Sprache . Ich entdeckte, dass die RegexMuster der britischen Regierung ist falsch und nicht zu richtig ein paar Postleitzahlen validieren. viele der Antworten hier sind auf Basis dieser falschen Muster Leider.

Ich werde einige dieser Fragen umreißen unten und bieten eine überarbeitete regulären Ausdruck, dass wirklich funktioniert.


Hinweis

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

  • Nur validiert Postleitzahl Formate .
  • stellt nicht sicher, dass eine Postleitzahl berechtigterweise existiert .
    • Verwenden Sie hierzu eine entsprechende API! Siehe Ben Antwort für weitere Informationen.

Wenn Sie nicht über den schlechten Regex egal und will einfach nur, um die Antwort zu überspringen, scrollen Sie zur Antwort .

Das Bad Regex

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

Dies ist die fehlerhafte regex, dass die britische Regierung Entwickler zur Verfügung gestellt hat (nicht sicher, wie lange diese Verbindung nach oben sein, aber Sie können es in ihrem Massendatentransfer Dokumentation ):

^([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 in Gebrauch hier .

Wie viele Entwickler wahrscheinlich tun, sie Kopieren / Einfügen-Code (insbesondere reguläre Ausdrücke) und fügen Sie sie erwarten, sie zu arbeiten. Während dies in der Theorie groß ist, in diesem speziellen Fall nicht, weil das Kopieren / Einfügen aus diesem Dokument tatsächlich eines der Zeichen (Leerzeichen) in ein Newline-Zeichen ändert sich wie folgt:

^([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 ist nur das Newline löschen, ohne zu überlegen. Jetzt wird die Regex nicht überein Postleitzahlen mit Leerzeichen in ihnen (außer dem GIR 0AA Postleitzahl).

Um dieses Problem zu beheben, sollten die Newline-Zeichen mit dem 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 in Gebrauch 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})$
^^                     ^ ^                                                                                                                                            ^^

Die Postleitzahl regex Anker falsch die Regex. Jeder, der diese regex Postleitzahlen bestätigen könnten überrascht sein, wenn ein Wert wie fooA11 1AA durchkommt. Das ist, weil sie den Beginn der ersten Option und das Ende der zweiten Option (unabhängig voneinander) verankert hat, wie oben in der Regex hingewiesen.

Das bedeutet, dass ^ (behauptet Position am Anfang der Zeile) funktioniert nur auf der ersten Option ([Gg][Ii][Rr] 0[Aa]{2}), so wird die zweite Option, um alle Saiten zu bestätigen, dass Ende in Postleitzahl (unabhängig davon, was kommt vor).

In ähnlicher Weise ist die erste Option ist nicht mit dem Ende der Leitung $ verankert, so GIR 0AAfoo wird ebenfalls 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 beiden Optionen in einer anderen Gruppe (oder Nicht-Erfassung Gruppe) gewickelt werden und die platzierten Anker herum, dass:

^(([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 - Ein falscher Zeichensatz

Siehe regex in Gebrauch 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})$
                                                                                       ^^

Die Regex fehlt hier ein - eine Reihe von Zeichen anzuzeigen. Wie es aussieht, wenn eine Postleitzahl im Format ANA NAA ist (wo A einen Brief und N darstellt eine number), und es beginnt mit etwas anderes als A oder Z, es wird fehlschlagen.

Das heißt, es wird A1A 1AA und Z1A 1AA passen, aber nicht B1A 1AA.

Um dieses Problem zu beheben, sollte der Charakter - zwischen den A und Z in dem jeweiligen Zeichensatz gesetzt 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})|(([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 - Wrong Optional Zeichensatz

Siehe regex in Gebrauch 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, sie haben nicht einmal diese Sache testen, bevor es auf dem Netz bekannt zu machen. Sie machten den falschen Zeichensatz optional. Sie machten [0-9] Option in der vierten Unteroption von Option 2 (Gruppe 9). Auf diese Weise können die Regex falsch formatiert Postleitzahlen wie AAA 1AA entsprechen.

Um dieses Problem zu beheben, stellt die nächste Zeichenklasse optional statt (und anschließend den Satz [0-9] Spiel macht genau einmal):

^([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

Performance auf dieser regex ist extrem schlecht. Zunächst einmal, sie platziert die geringste Möglichkeit wahrscheinlich Muster GIR 0AA am Anfang übereinstimmen. Wie viele Benutzer werden wahrscheinlich diese Postleitzahl im Vergleich zu jeder anderen Postleitzahl; wahrscheinlich nie? Das bedeutet, jedes Mal die Regex verwendet wird, muss es diese Option erschöpfen, bevor zur nächsten Option fortfahren. Um zu sehen, wie die Leistung beeinträchtigt wird, um die Anzahl der Schritte, überprüfen Sie die ursprüngliche regex nahm (35) gegen die < a href = "https://regex101.com/r/ajQHrd/6" rel = "noreferrer"> gleiche Regex, nachdem die (22) Optionen gekippt hat.

Die zweite Ausgabe mit Leistung ist auf den Weg durch die gesamte Regex strukturiert ist. Es gibt keinen Grund Rückzieher über jede Option, wenn einer ausfällt. Die Art und Weise der aktuelle Regex strukturiert ist stark vereinfacht werden kann. Ich biete eine Lösung für diese in der Antwort .

Problem 6 - Spaces

Siehe regex in Gebrauch hier

Dies kann nicht ein Problem in Betracht gezogen werden, per se, aber es hat Sorge für die meisten Entwickler erhöhen. Die Räume in der Regex sind nicht optional, was bedeutet, dass die Benutzer ihre Postleitzahlen Eingabe einen Raum in der Postleitzahl platzieren müssen. Dies ist eine einfache Lösung durch einfaches Hinzufügen von ? nach den Räumen sie optional zu machen. Sehen Sie die Antwort für eine Korrektur.


Antwort

1. Festsetzung der britischen Regierung Regex

Fixing alle skizzierten Probleme in der Probleme und das Muster Vereinfachung ergibt sich die folgende, kürzere, prägnante Muster. Wir können auch die meisten Gruppen entfernen, da wir die Postleitzahl als Ganzes sind die Validierung (nicht einzelne Teile):

Siehe regex in Gebrauch 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 durch alle Bereiche von einem der Fälle (Groß- oder Kleinschreibung) und unter Verwendung einer Groß- und Kleinschreibung Flagge zu entfernen verkürzt werden. Hinweis : Einige Sprachen noch kein Konto haben, so verwenden Sie die länger oben. Jede Sprache implementiert die Fall-Unempfindlichkeit Flagge anders.

Siehe regex in Gebrauch hier .

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

Kürzere wieder ersetzt [0-9] mit \d (wenn Ihre Regex-Engine unterstützt):

Siehe regex in Gebrauch hier .

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

2. Vereinfachte Muster

Ohne spezifische Buchstaben zu gewährleisten, kann die folgende verwendet wird (halten Sie die Vereinfachungen von 1 im Auge Befestigung der britischen Regierung Regex hat auch hier angewandt.):

Siehe regex inverwenden hier .

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

Und noch weiter, wenn Sie über den Sonderfall GIR 0AA do not care:

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

3. Komplizierte Muster

Ich würde nicht über Überprüfung der Postleitzahl als neue Gebiete, Bezirke und Unterbezirke vorschlagen zu jedem Zeitpunkt erscheinen. Was ich vorschlagen möglicherweise Dadurch wird zusätzliche Unterstützung für kanten Fälle. Einige Sonderfälle existieren und in diesem Wikipedia-Artikel beschrieben.

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

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

Siehe regex in Gebrauch 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. Vereinfachtes Muster :

Siehe regex in Gebrauch 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

Der Wikipedia-Artikel zur Zeit heißt es (einige Formate leicht vereinfacht):

  • AI-1111: Anguila
  • ASCN 1ZZ: Ascension
  • STHL 1ZZ: St. Helena
  • TDCU 1ZZ: Tristan da Cunha
  • BBND 1ZZ: Britisches Territorium im Indischen Ozean
  • BIQQ 1ZZ: Britisches Antarktis-Territorium
  • FIQQ 1ZZ: Falkland-Inseln
  • GX11 1ZZ: Gibraltar
  • PCRN 1ZZ: Pitcairn
  • SIQQ 1ZZ: Südgeorgien und die Südlichen Sandwichinseln
  • TKCA 1ZZ: Turks- und Caicosinseln
  • BFPO 11: Akrotiri und Dhekelia
  • ZZ 11 & GE CX: Bermuda (nach dieses Dokument )
  • KY1-1111: Cayman Islands (nach dieses Dokument )
  • VG1111: British Virgin Islands (nach dieses Dokument )
  • MSR 1111: Montserrat (nach dieses Dokument )

Eine allumfassende regex nur die britische Überseegebiete passen könnte wie folgt aussehen:

Siehe regex in Gebrauch 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 British Forces Post

Obwohl sie haben es vor kurzem geändert worden mit dem britischen Postleitzahlensystem besser ausrichten BF# (wo # eine Zahl steht), sie sind als optionale Alternative Postleitzahlen . Diese Postleitzahlen folgen (ed) das Format der BFPO, gefolgt von 1-4 Ziffern:

Siehe regex in Gebrauch hier

^BFPO ?\d{1,4}$

3.3 Sankt?

Es gibt einen weiteren Spezialfall mit Santa (wie in anderen Antworten erwähnt): SAN TA1 eine gültige Postleitzahl ist. Regulärer Ausdruck dafür ist sehr einfach:

^SAN ?TA1$

hatte ich einen Blick in einige der Antworten oben und ich gegen die Verwendung des Musters empfehlen würde von @ Dans Antwort (c. 15. Dezember '10) , da es falsch Flags fast 0,4% der gültigen Postleitzahlen als ungültig, während die andere nicht tun.

Ordnance Survey bieten Service namens Code Point öffnen, das:

  

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

Ich lief jeden der regexs oben gegen die vollständige Liste der Postleitzahlen (6. Juli '13) aus diesen Daten mit grep:

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 1.686.202 Postleitzahlen insgesamt.

Im folgenden die Zahl der gültigen Postleitzahlen sind, dass nicht jeder $pattern entsprechen:

'^([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

Natürlich befassen sich diese Ergebnisse nur mit gültigen Postleitzahlen, die als ungültig markiert sind falsch. Also:

'^.*$'
# => 0

Ich sage nichts über welches Muster ist das beste in Bezug auf ungültige Postleitzahlen Ausfiltern.

^([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 gültig UK übereinstimmen   Postleitzahlen. Im Postsystem in Großbritannien nicht   Alle Buchstaben werden in allen Positionen verwendet   (Das gleiche mit den Fahrzeugregistrierungs   Platten) und es gibt verschiedene Regeln zu   regeln dies. Diese Regex nimmt in   diese Regeln berücksichtigen. Details von der   Regeln: Erste Hälfte Postleitzahl Valid   Formate [A-Z] [A-Z] [0-9] [A-Z]   [A-Z] [A-Z] [0-9] [0-9] [A-Z] [0-9] [0-9]   [A-Z] [A-Z] [0-9] [A-Z] [A-Z] [A-Z]   [A-Z] [0-9] [A-Z] [A-Z] [0-9] Ausnahmen   Position - Erste. Contraint - QVX nicht   gebrauchte Position - Zweite. contraint -   IJZ nicht außer in GIR 0AA verwendet   Position - Dritter. Constraint -   AEHMNPRTVXY nur Position verwendet -   Forth. Contraint - ABEHMNPRVWXY Zweite   die Hälfte der Postleitzahl Gültige Formate   [0-9] [A-Z] [A-Z] Ausnahmen Position -   Zweiter und Dritter. Contraint - CIKMOV   nicht verwendet

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

Die meisten Antworten hier nicht für alle Postleitzahlen arbeite ich in meiner Datenbank. Schließlich fand ich eine, die mit allen bestätigt, die neuen regex von der Regierung zur Verfügung gestellt werden:

https: // www .gov.uk / Regierung / uploads / system / uploads / attachment_data / file / 413.338 / Bulk_Data_Transfer _-_ additional_validation_valid_from_March_2015.pdf

Es ist nicht in einem der vorhergehenden Antworten, damit ich es hier bei Post nehmen sie auf den Link unten:

^([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: Aktualisiert regex wie von Jamie Bull zeigte. Nicht sicher, ob es mein Fehler war das Kopieren oder es ist ein Fehler in der regex der Regierung, der Link ist unten jetzt ...

UPDATE: Wie ctwheels gefunden, diese Regex mit dem Javascript regex Geschmack funktioniert. Siehe seinen Kommentar für eine, die mit der pcre (php) Geschmack funktioniert.

Nach dieser Wikipedia-Tabelle

eingeben Bild Beschreibung hier

Dieses Muster deckt alle Fälle

(?:[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 es auf Android \ Java verwenden verwenden \\ d

Eine alte Post, aber immer noch ziemlich hoch in Google-Ergebnisse, also dachte ich aktualisieren würde. Diese 14 doc Oktober legt die UK Postleitzahl regulären Ausdruck als:

^([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 / Regierung / uploads / system / uploads / attachment_data / file / 359.448 / 4__Bulk_Data_Transfer _-_ additional_validation_valid.pdf

Das Dokument erklärt sich auch die Logik dahinter. Allerdings hat es einen Fehler (bolded) und erlaubt auch Kleinbuchstaben, die zwar legal ist nicht üblich, so geänderte Fassung:

^(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})$

Das funktioniert mit neuem London Postleitzahlen (z W1D 5LH), dass früheren Versionen nicht.

Dies ist der regex Google auf ihrem i18napis.appspot.com Domain:

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}

Postleitzahlen sind freibleibend, und der einzig wahre Weg, um eine Postleitzahl der Validierung ist die komplette Liste der Postleitzahlen zu haben, und sehen, ob es da ist.

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

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

Aber reguläre Ausdrücke sind in der Regel schwer zu halten, vor allem für jemanden, der nicht mit ihm an erster Stelle kommen hat. So muss es sein:

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

Das bedeutet, dass die meisten der regulären Ausdrücke in dieser Antwort sind nicht gut genug. Z.B. Ich kann sehen, dass [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] wird eine Postleitzahl des Formular AA1A passen - aber es wird ein Schmerz im Nacken sein, ob und wann ein neuer PLZ-Bereich hinzugefügt wird, weil es schwierig ist, zu verstehen, welche Postleitzahlgebiete sie paßt

Ich möchte auch mein regulärer Ausdruck die erste und zweite Hälfte der Postleitzahl als parenthesised Spiele entsprechen.

Also ich habe mit diesem kommen:

(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})

In 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 so viel wie möglich Validierung, während gleichzeitig der Zukunftssicherheit und ermöglicht eine einfache Wartung.

Ich habe für den letzten Tag für eine UK Postleitzahl regex gesucht oder so und auf diesem Thread gestolpert. Ich arbeitete mich durch die meisten der oben genannten Vorschläge und keiner von ihnen arbeitete für mich so kam ich mit meiner eigenen regex auf die, soweit ich weiß, alle gültigen Postleitzahlen in Großbritannien als von Jan von '13 (nach dem neuesten Stand der Literatur erfasst die Royal Mail).

Die Regex und einige einfache PHP-Code Postleitzahl Prüfung wird unten geschrieben. HINWEIS: - Es ist für Klein- oder Groß Postleitzahlen ermöglicht und die GIR 0AA Anomalie aber mit dem zu tun, mehr als wahrscheinlich, der Anwesenheit von einem Raum in der Mitte eines eingegebenen Postleitzahl es macht auch die Verwendung eines einfachen str_replace vor dem Test, den Raum zu entfernen gegen die regex. Etwaige Abweichungen darüber hinaus und die Royal selbst E-Mail an nicht einmal erwähnen sie in ihrer Literatur (siehe http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf und starten Sie ab Seite lesen 17)!

Hinweis: In der eigenen Literatur Royal Mail (Link oben) gibt es eine leichte Zweideutigkeit der 3. und 4. Positionen und die Ausnahmen in Ort umgebenden wenn diese Zeichen Buchstaben sind. Ich kontaktierte Royal Mail direkt es zu klären und in ihren eigenen Worten „Ein Brief in der 4. Position des Outward-Code mit dem Format AANA NAA keine Ausnahmen hat und die dritte Position Ausnahmen gelten nur für die letzten Buchstaben des Outward Code mit der 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 jemand anderes, das über diesen Thread Suche nach einer Lösung kommt.

Hier ist ein regulärer Ausdruck über die in den Dokumenten angegebenen Format basiert, die auf marcj Antwort verknüpft sind:

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

Der einzige Unterschied zwischen diesem und den Spezifikationen ist, dass die letzten 2 Zeichen, die nicht in sein kann [CIKMOV] entsprechend den Spezifikationen.

Edit: Hier ist eine andere Version, die Test für die hinteren Zeichen Einschränkungen hat.

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

Einige der regexs oben sind ein wenig restriktiv. Beachten Sie die echte Postleitzahl: „W1K 7AA“ würde fail die Regel „Position 3 - AEHMNPRTVXY nur verwendet“ gegeben oben als „K“ würde nicht anerkannt werden

.

die 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})$

Es scheint ein wenig genauer, finden Sie in der Wikipedia Artikel mit dem Titel ‚Postleitzahlen im Vereinigten Königreich‘ .

Beachten Sie, dass dieser regex Groß nur Zeichen erfordert.

Die größere Frage ist, ob Sie Benutzereingaben beschränken nur Postleitzahlen zu ermöglichen, die tatsächlich existieren oder ob Sie einfach versuchen, Benutzer Eingabe kompletten Mülls in die Formularfelder zu stoppen. Korrekt jede mögliche Postleitzahl passende und Zukunftssicherheit es ist ein schwieriges Rätsel, und wahrscheinlich nicht wert, wenn Sie HMRC sind.

Grundregeln:

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

Postleitzahlen in dem U. K. (oder Postleitzahlen, wie sie genannt werden) wird von fünf bis sieben alphanumerischen Zeichen durch ein Leerzeichen getrennt zusammengesetzt. Die Regeln für die Zeichen an bestimmten Positionen erscheinen können, sind ziemlich kompliziert und voller Ausnahmen. Der reguläre Ausdruck daher nur gezeigt hält sich an die Grundregeln.

Komplette Regeln:

Wenn Sie eine regex müssen, die für die Postleitzahl Regeln auf Kosten der Lesbarkeit alle Boxen Zecken, hier gehen Sie:

^(?:(?:[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 / reguläre Ausdrücke-Kochbuch / 9781449327453 / ch04s16.html

Getestet gegen unsere Kunden-Datenbank und scheint vollkommen korrekt.

Ich verwende die folgende regex, dass ich gegen alle gültigen Postleitzahlen in Großbritannien getestet haben. Es basiert auf den empfohlenen Regeln, aber so viel wie vernünftig kondensiert und keinen Gebrauch von irgendwelchen speziellen sprachspezifische Regeln regex machen.

([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 geht davon aus, dass die Postleitzahl in Großbuchstaben umgewandelt wurden und Zeichen, die nicht am Anfang oder Ende, werden aber einen optionalen Raum zwischen dem äußeren Codes und incode nehmen.

Der speziell „GIR0 0AA“ Postleitzahl ist ausgeschlossen und wird nicht überprüft, da es nicht in der offiziellen Post Office Liste der Postleitzahlen, und soweit mir bewusst bin nicht so registriert Adresse verwendet werden. Hinzufügen sollte es als Sonderfall trivial sein, falls erforderlich.

Erste Hälfte Postleitzahl Gültige Formate

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

Ausnahmen
Position 1 - QVX nicht verwendet
Position 2 - IJZ nicht außer in GIR 0AA
verwendet Position 3 - AEHMNPRTVXY nur verwendet
Position 4 - ABEHMNPRVWXY

Die zweite Hälfte der Postleitzahl

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

Ausnahmen
Position 2 + 3 - CIKMOV nicht verwendet

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

hier ist, wie wir wurden mit der britischen Postleitzahl Frage beschäftigen:

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

Erklärung:

  • erwarten 1 oder 2 a-z Zeichen, obere oder untere Fein
  • erwarten 1 oder 2 Nummern
  • erwarten 0 oder 1 a-z char, obere oder untere Fein
  • optional Raum erlaubt
  • erwarten 1 Nummer
  • erwarten 2 a-z, obere oder untere Fein

Dies wird die meisten Formate, wir dann die DB verwenden zu überprüfen, ob die Postleitzahl tatsächlich real ist, diese Daten durch openpoint angetrieben wird https://www.ordnancesurvey.co.uk/opendatadownload/products.html

hoffe, das hilft

Postleitzahl Um zu überprüfen, ist in einem gültigen Format gemäß dem Royal Mail |----------------------------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 Spiel, mit Ausnahme derjenigen, nicht mehr in verwenden.

ein ? nach dem Raum hinzufügen und unter Verwendung von Groß- und Kleinschreibung übereinstimmen, 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" ]

Dies ermöglicht leere Leerzeichen und Tabulatoren von beiden Seiten, falls Sie nicht wollen, Validierung fehlschlagen und dann schneiden Sie es Seite trennen.

^\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*$)

wollte ich eine einfache regex, wo es ist in Ordnung, zu viel zu erlauben, aber keine gültige Postleitzahl zu verweigern. Ich ging mit diesem (der Eingang ist eine vereinfachte / getrimmten string):

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

Lengths 5 bis 7 (ohne Leerzeichen) bedeutet, dass wir die kürzest mögliche Postleitzahlen wie „L1 8JQ“ sowie den längsten wie „OL14 5ET“ ermöglichen.

EDIT:. Changed die 8 zu einem 7 so nicht mehr als 8 Zeichen wir erlauben Postleitzahlen

auf diese Liste eine praktischere regex hinzuzufügen, die ich verwende, dass der Benutzer erlaubt, eine empty string einzugeben:

^$|^(([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 Kleinbuchstaben mit einem optionalen Zwischenraum

Von einem Software-Entwickler Sicht diese regex für Software nützlich ist, wenn eine Adresse optional sein kann. Zum Beispiel, wenn ein Benutzer will nicht ihre Adresse Details

liefern

Haben Sie einen Blick auf dem Python-Code auf dieser Seite:

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

  

Ich habe einige Postleitzahl Parsing zu erledigen. Die Anforderung ist ziemlich einfach; Ich habe eine Postleitzahl in eine outcode und (optional) incode zu analysieren. Die gute neu ist, dass ich eine Validierung nicht durchführen müssen - ich habe nur zerhacken, was ich mit in eine vage intelligente Art und Weise zur Verfügung gestellt. Ich kann nicht in Bezug auf die Formatierung, das heißt Fall und eingebettete Leerzeichen viel über meine Import übernehmen. Aber das ist nicht die schlechte Nachricht; Die schlechte Nachricht ist, dass ich alles in RPG zu tun haben. : - (

     

Dennoch warf ich eine kleine Python-Funktion zusammen, mein Denken zu klären.

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

Wir erhielten eine spec:

UK postcodes must be in one of the following forms (with one exception, see below): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
where A represents an alphabetic character and 9 represents a numeric character.
Additional rules apply to alphabetic characters, as follows:
    § The character in position 1 may not be Q, V or X
    § The character in position 2 may not be I, J or Z
    § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z
    § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z
    § The characters in the rightmost two positions may not be C, I, K, M, O or V
The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.

Wir kamen auf diese:

/^([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

Aber Achtung - dies ermöglicht eine beliebige Anzahl von Räumen in zwischen den Gruppen.

Ich habe die Regex für UK Postleitzahl Validierung.

Dies funktioniert für alle Arten von Postleitzahl entweder inneren oder äußeren

^((([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 ist für alle Arten von Format zu arbeiten.

Beispiel:

  

AB10 --------------------> NUR OUTER POSTLEITZAHLEN

     

A1 1AA ------------------> KOMBINATION (äußere und innere) POSTLEITZAHL

     

WC2A --------------------> OUTER

Die akzeptierte Antwort spiegelt die gegebenen Regeln von Royal Mail, obwohl es ein Tippfehler in der Regex ist. Dieser Tippfehler scheint auch dort auf dem gov.uk Ort gewesen zu sein (wie es in der XML-Archivseite ist).

Im Format A9A 9AA erlauben die Regeln ein P Zeichen in der dritten Position, während die regex diese nicht zulässt. Die richtige regex 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}) 

Kürzen ergibt sich die folgende regex (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 Raum zwischen dem ersten und zweiten Block.

Was ich in fast die Variationen alle und die Regex aus dem Bulk-Transfer pdf gefunden haben und was auf wikipedia Seite ist diese, die speziell für die wikipedia regex ist, gibt es eine ^ nach dem ersten sein muss | (vertikaler Strich) . Ich dachte, dies durch Tests heraus für AA9A 9AA, da sonst die Formatprüfung für A9A 9AA es validieren. Für das Beispiel für EC1D 1BB Überprüfung, welche ungültig sein sollte kommt wieder gültig, da C1D 1BB gültiges Format ist.

Hier ist, was ich mit für eine gute Regex habe kommen:

^([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})$

Ich brauchte eine Version, die in SAS mit den PRXMATCH und verwandten Funktionen funktionieren würde, so dass ich kam mit dieser:

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

Die 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;

Unter Methode wird die Postleitzahl überprüfen und bietet komplette Info

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!"}

Ich habe dies aus einem XML-Dokument, und es scheint, alle Fälle ohne den hart codierte GIRO abzudecken:

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

(Ruby-Syntax mit Fall ignorieren)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top