REGEX zum Abgleichen UK Postleitzahlen
-
03-07-2019 - |
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?
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:
-
Ordnance Survey veröffentlicht -Code-Punkt Öffnen unter einer Open-Daten-Lizenz. Es wird hinter der Zeit sehr leicht sein, aber es ist kostenlos. Dies wird (wahrscheinlich - ich kann mich nicht erinnern) nicht in Nordirland Daten enthalten als die Ordnance Survey keinen Auftrag dort hat. Mapping in Nordirland wird von der Ordnance Survey von Nordirland durchgeführt und sie haben ihr, zu trennen, einbezahlte für Pointer Produkt. Sie könnten dies nutzen und fügen Sie die wenigen, die nicht ziemlich leicht abgedeckt werden.
-
Royal Mail gibt die rel="noreferrer"> enthält diese BFPO, die ich bin nicht sicher, tut-Code-Punkt öffnen. Es wird regelmäßig aktualisiert, aber kostet Geld (und sie können geradezu über sie manchmal gemein sein). PAF enthält die vollständige Adresse nicht nur Postleitzahlen und kommt mit seinen eigenen Programmierern Führer . Die Open Data User Group (ODUG) Lobbying derzeit kostenlos PAF freigegeben zu haben, hier ist eine Beschreibung ihrer Position .
-
Schließlich gibt es AddressBase . Dies ist eine Zusammenarbeit zwischen Ordnance Survey, lokale Behörden, Royal Mail und einem passenden Unternehmen eine definitive Verzeichnis aller Informationen über alle UK-Adressen zu erstellen (sie haben auch recht erfolgreich). Es ist einbezahlten für, aber wenn Sie mit einer lokalen Behörde, die Regierungsstelle oder Staatsdienst arbeiten ist es kostenlos für sie zu verwenden. There ist viel mehr Informationen als nur Postleitzahlen enthalten.
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
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):
^([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 :
^(([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 :
^(([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:
^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
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:
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
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:
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)$
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 Alle Postleitzahlen auf doogal.co.uk Spiel, mit Ausnahme derjenigen, nicht mehr in verwenden. ein |----------------------------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})$
?
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
liefernHaben 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)