Ich bin hinter einer Regex her, die eine vollständige komplexe britische Postleitzahl nur innerhalb einer Eingabezeichenfolge validiert. Alle ungewöhnlichen Postleitzahlenformulare müssen ebenso wie üblich abgedeckt sein. Zum Beispiel:
Streichhölzer
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Keine Übereinstimmung
- aWC2H 7LT
- WC2H 7LTa
- WC2H
Wie löse ich dieses Problem?
regex
validation
regex-group
postal-code
Kieran Benton
quelle
quelle
Antworten:
Ich würde empfehlen, einen Blick auf den britischen Regierungsdatenstandard für Postleitzahlen zu werfen [Link jetzt tot; XML-Archiv , 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 möglicherweise nicht genau das, was Sie wollen, aber es wäre ein guter Ausgangspunkt. Das RegEx unterscheidet sich geringfügig vom XML, da ein P-Zeichen an dritter Stelle im Format A9A 9AA gemäß der angegebenen Definition zulässig ist.
Der von der britischen Regierung gelieferte RegEx war:
Wie in der Wikipedia-Diskussion erwähnt, werden dadurch einige nicht reale Postleitzahlen (z. B. solche, die mit AA, ZY beginnen) zugelassen, und sie bieten einen strengeren Test, den Sie ausprobieren können.
quelle
^([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})$
Es sieht so aus, als würden wir verwenden
^(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})$
, 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 offenbar unterschiedliche Regeln für die zulässigen Buchstaben anwenden.
Nach einigen Recherchen haben wir weitere Informationen gefunden. Anscheinend verweist eine Seite auf 'govtalk.gov.uk' auf eine Postleitzahlenspezifikation govtalk-postcodes . Dies verweist auf ein XML-Schema im XML-Schema , das eine 'Pseudo-Regex'-Anweisung der Postleitzahlenregeln enthält.
Wir haben das genommen und ein wenig daran gearbeitet, um uns den folgenden Ausdruck zu geben:
Dies macht Leerzeichen optional, beschränkt Sie jedoch auf ein Leerzeichen (ersetzen Sie das '&' durch '{0,} für unbegrenzte Leerzeichen). Es wird davon ausgegangen, dass der gesamte Text in Großbuchstaben geschrieben sein muss.
Wenn Sie Kleinbuchstaben mit einer beliebigen Anzahl von Leerzeichen zulassen möchten, verwenden Sie:
Dies gilt nicht für Überseegebiete und erzwingt nur das Format, NICHT die Existenz verschiedener Gebiete. Es basiert auf den folgenden Regeln:
Kann die folgenden Formate akzeptieren:
Wo:
Die besten Wünsche
Colin
quelle
^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[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}))$
{0,}
anstelle von*
unbegrenzten optionalen Leerzeichen angeben ?Ich habe kürzlich eine Antwort auf diese Frage auf britischen Postleitzahlen für die R-Sprache veröffentlicht . Ich habe festgestellt, dass das Regex-Muster der britischen Regierung falsch ist und nicht richtig funktioniert einige Postleitzahlen validiert werden kann. Leider basieren viele der Antworten hier auf diesem falschen Muster.
Ich werde im Folgenden einige dieser Probleme skizzieren und einen überarbeiteten regulären Ausdruck bereitstellen, der tatsächlich funktioniert.
Hinweis
Meine Antwort (und reguläre Ausdrücke im Allgemeinen):
Wenn Sie sich nicht für den schlechten regulären Ausdruck interessieren und nur zur Antwort springen möchten, scrollen Sie nach unten zum Abschnitt Antwort .
Der schlechte Regex
Die regulären Ausdrücke in diesem Abschnitt sollten nicht verwendet werden.
Dies ist die fehlgeschlagene Regex, die die britische Regierung Entwicklern zur Verfügung gestellt hat (nicht sicher, wie lange dieser Link bestehen wird, aber Sie können ihn in ihrer Dokumentation zur Massendatenübertragung sehen ):
Probleme
Problem 1 - Kopieren / Einfügen
Siehe Regex, der hier verwendet wird .
Wie viele Entwickler wahrscheinlich, kopieren / fügen sie Code (insbesondere reguläre Ausdrücke) ein und fügen sie ein, damit sie funktionieren. Obwohl dies theoretisch großartig ist, schlägt es in diesem speziellen Fall fehl, weil das Kopieren / Einfügen aus diesem Dokument tatsächlich eines der Zeichen (ein Leerzeichen) in ein Zeilenumbruchzeichen ändert, wie unten gezeigt:
Das erste, was die meisten Entwickler tun, ist, die neue Zeile zu löschen, ohne darüber nachzudenken. Jetzt ordnet der reguläre Ausdruck Postleitzahlen nicht mehr Leerzeichen zu (außer dem
GIR 0AA
Postleitzahl).Um dieses Problem zu beheben, sollte das Zeilenumbruchzeichen durch das Leerzeichen ersetzt werden:
Problem 2 - Grenzen
Siehe Regex, der hier verwendet wird .
Der Postleitzahl-Regex verankert den Regex nicht ordnungsgemäß. Jeder, der diese Regex verwendet, um Postleitzahlen zu validieren, könnte überrascht sein, 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 regulären Ausdruck ausgeführt.Dies bedeutet, dass
^
(Position am Zeilenanfang bestätigt) nur für die erste Option funktioniert([Gg][Ii][Rr] 0[Aa]{2})
, sodass die zweite Option alle Zeichenfolgen überprüft, die enden mit einer Postleitzahl (unabhängig davon, was vorher kommt).In ähnlicher Weise ist die erste Option nicht bis zum Ende der Zeile verankert
$
, soGIR 0AAfoo
auch akzeptiert wird.Um dieses Problem zu beheben, sollten beide Optionen in eine andere Gruppe (oder eine nicht erfassende Gruppe) eingeschlossen und die Anker um diese herum platziert werden:
Problem 3 - Falscher Zeichensatz
Siehe Regex, der hier verwendet wird .
In der Regex fehlt
-
hier ein Zeichen für eine Reihe von Zeichen. So wie es aussieht, wenn eine Postleitzahl das Format hatANA NAA
(wobeiA
ein Buchstabe undN
eine Zahl steht) und mit etwas anderem alsA
oder beginntZ
sie fehl.Das heißt, es wird passen
A1A 1AA
undZ1A 1AA
, aber nichtB1A 1AA
.Um dieses Problem zu beheben, sollte das Zeichen
-
zwischenA
undZ
im jeweiligen Zeichensatz platziert werden:Problem 4 - Falscher optionaler Zeichensatz
Siehe Regex, der hier verwendet wird .
Ich schwöre, sie haben dieses Ding nicht einmal getestet, bevor sie es im Internet veröffentlicht haben. Sie haben den falschen Zeichensatz optional gemacht. Sie machten
[0-9]
Option in der vierten Unteroption von Option 2 (Gruppe 9). Dadurch kann der Regex mit falsch formatierten Postleitzahlen wie übereinstimmenAAA 1AA
.Um dieses Problem zu beheben, machen Sie stattdessen die nächste Zeichenklasse optional (und lassen Sie den Satz anschließend
[0-9]
genau einmal übereinstimmen):Problem 5 - Leistung
Die Leistung dieser Regex ist extrem schlecht. Zunächst platzierten sie die am wenigsten wahrscheinliche Musteroption,
GIR 0AA
die zu Beginn übereinstimmt . Wie viele Benutzer werden diese Postleitzahl wahrscheinlich im Vergleich zu einer anderen Postleitzahl haben? wahrscheinlich nie? Dies bedeutet, dass bei jeder Verwendung des regulären Ausdrucks diese Option zuerst ausgeschöpft werden muss, bevor mit der nächsten Option fortgefahren werden kann. Um zu sehen, wie sich die Leistung auf die Leistung auswirkt, überprüfen Sie die Anzahl der Schritte, die der ursprüngliche reguläre Ausdruck (35) mit demselben regulären Ausdruck ausgeführt hat, nachdem Sie die Optionen umgedreht haben (22).Das zweite Problem mit der Leistung ist auf die Struktur des gesamten regulären Ausdrucks zurückzuführen. Es macht keinen Sinn, jede Option zurückzuverfolgen, wenn eine fehlschlägt. Die Struktur des aktuellen regulären Ausdrucks kann erheblich vereinfacht werden. Ich gebe eine Lösung dafür im Abschnitt Antwort .
Problem 6 - Leerzeichen
Siehe Regex, der hier verwendet wird
Dies kann an sich nicht als Problem angesehen werden , gibt jedoch den meisten Entwicklern Anlass zur Sorge. Die Leerzeichen in der Regex sind nicht optional. Dies bedeutet, dass die Benutzer, die ihre Postleitzahlen eingeben, ein Leerzeichen in die Postleitzahl einfügen müssen. Dies ist eine einfache Lösung, indem Sie einfach
?
nach den Leerzeichen hinzufügen , um sie optional zu machen. 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, der hier verwendet wird
Dies kann weiter verkürzt werden, indem alle Bereiche aus einem der Fälle (Groß- oder Kleinschreibung) entfernt und ein Flag verwendet werden, bei dem die Groß- und 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 anders.
Siehe Regex, der hier verwendet wird .
Kürzere wieder ersetzt
[0-9]
mit\d
(wenn Ihre Regex - Engine unterstützt):Siehe Regex, der hier verwendet wird .
2. Vereinfachte Muster
Ohne bestimmte alphabetische Zeichen zu gewährleisten, kann Folgendes verwendet werden (beachten Sie die Vereinfachungen ab 1. Die Korrektur des Regex der britischen Regierung wurde auch hier angewendet):
Siehe Regex, der hier verwendet wird .
Und noch weiter, wenn Sie sich nicht für den Sonderfall interessieren
GIR 0AA
:3. Komplizierte Muster
Ich würde nicht empfehlen, eine Postleitzahl zu stark zu überprüfen, da zu jedem Zeitpunkt neue Gebiete, Bezirke und Unterbezirke erscheinen können. Was ich möglicherweise vorschlagen werde , ist die zusätzliche Unterstützung für Randfälle. Einige Sonderfälle existieren und werden in diesem Wikipedia-Artikel beschrieben .
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, der hier verwendet wird
Und in Bezug auf 2. Vereinfachte Muster :
Siehe Regex, der hier verwendet wird
3.1 Britische Überseegebiete
Im Wikipedia-Artikel heißt es derzeit (einige Formate leicht vereinfacht):
AI-1111
: AnguilaASCN 1ZZ
: Ascension IslandSTHL 1ZZ
: Heilige HelenaTDCU 1ZZ
: Tristan da CunhaBBND 1ZZ
: Britisches Territorium des Indischen OzeansBIQQ 1ZZ
: Britisches AntarktisgebietFIQQ 1ZZ
: Falkland InselnGX11 1ZZ
: GibraltarPCRN 1ZZ
: PitcairninselnSIQQ 1ZZ
: Süd-Georgien und die südlichen Sandwich-InselnTKCA 1ZZ
: Turks- und CaicosinselnBFPO 11
: Akrotiri und DhekeliaZZ 11
&GE CX
: Bermuda (laut diesem Dokument )KY1-1111
: Cayman Islands (gemäß diesem Dokument )VG1111
: Britische Jungferninseln (gemäß diesem Dokument )MSR 1111
: Montserrat (gemäß diesem Dokument )Ein umfassender Regex, der nur den britischen Überseegebieten entspricht, könnte folgendermaßen aussehen:
Siehe Regex, der hier verwendet wird .
3.2 Post der britischen Streitkräfte
Obwohl sie kürzlich geändert wurden, um sie besser an das britische Postleitzahlensystem anzupassen
BF#
(wobei#
eine Zahl steht), gelten sie als optionale alternative Postleitzahlen . Diese Postleitzahlen folgen dem Format vonBFPO
, gefolgt von 1-4 Ziffern:Siehe Regex, der hier verwendet wird
3.3 Santa?
Es gibt noch einen weiteren Sonderfall mit dem Weihnachtsmann (wie in anderen Antworten erwähnt):
SAN TA1
ist eine gültige Postleitzahl. Eine Regex dafür ist sehr einfach:quelle
Es gibt keinen umfassenden regulären Ausdruck für die britische Postleitzahl, mit dem eine Postleitzahl validiert werden kann . Sie können mithilfe eines regulären Ausdrucks überprüfen, ob eine Postleitzahl im richtigen Format vorliegt. nicht, dass es tatsächlich existiert.
Postleitzahlen sind beliebig komplex und ändern sich ständig. Zum Beispiel hat die Outcode
W1
nicht und möglicherweise nie jede Nummer zwischen 1 und 99 für jeden Postleitzahlenbereich.Sie können nicht erwarten, dass das, was derzeit da ist, für immer wahr ist. Zum Beispiel entschied die Post 1990, dass Aberdeen etwas überfüllt war. Sie fügten am Ende von AB1-5 eine 0 hinzu, was AB10-50 ergibt, und erstellten dann 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 mit der Post auf dem Laufenden zu halten (nicht dass dies alle tun).
Darüber hinaus gibt es, wie von einer Reihe anderer Benutzer festgestellt, spezielle Postleitzahlen wie Girobank, GIR 0AA und die für Briefe an den Weihnachtsmann, SAN TA1 - Sie möchten dort wahrscheinlich nichts posten, aber es scheint nicht so durch eine andere Antwort abgedeckt werden.
Dann gibt es die BFPO-Postleitzahlen, die jetzt auf ein Standardformat umgestellt werden . Beide Formate sind gültig. Schließlich gibt es die Quelle Wikipedia für Überseegebiete .
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 Aufgabenbereich hat. Die Kartierung in Nordirland wird von der Ordnance Survey of Northern Ireland durchgeführt und sie haben ihr separates, kostenpflichtiges Zeigerprodukt . Sie können dies verwenden und die wenigen anhängen, die nicht so einfach behandelt werden.
Royal Mail veröffentlicht die Postleitzahl-Adressdatei (PAF) , einschließlich BFPO, von der ich nicht sicher bin, ob Code-Point Open dies tut. Es wird regelmäßig aktualisiert, kostet aber Geld (und sie können manchmal geradezu gemein sein). PAF enthält die vollständige Adresse und nicht nur Postleitzahlen und wird mit einem eigenen Programmierhandbuch geliefert . Die Open Data User Group (ODUG) setzt sich derzeit dafür ein, dass PAF kostenlos veröffentlicht wird. Hier finden Sie eine Beschreibung ihrer Position .
Schließlich gibt es noch AddressBase . Dies ist eine Zusammenarbeit zwischen Ordnance Survey, Local Authorities, Royal Mail und einem passenden Unternehmen, um ein endgültiges Verzeichnis aller Informationen zu allen britischen Adressen zu erstellen (sie waren auch ziemlich erfolgreich). Es ist bezahlt, aber wenn Sie mit einer lokalen Behörde, einer Regierungsabteilung oder einem Regierungsdienst zusammenarbeiten, können sie diese kostenlos nutzen. Es gibt viel mehr Informationen als nur Postleitzahlen.
quelle
Ich habe mir einige der obigen Antworten angesehen und würde empfehlen, das Muster aus @ Dans Antwort (ca. 15. Dezember 10) nicht zu verwenden , da es fast 0,4% der gültigen Postleitzahlen fälschlicherweise als ungültig kennzeichnet, während die anderen dies nicht tun .
Ordnance Survey bietet einen Service namens Code Point Open an, der:
Ich habe jeden der obigen regulären Ausdrücke anhand dieser Daten gegen die vollständige Liste der Postleitzahlen (6. Juli 13) ausgeführt
grep
:Insgesamt gibt es 1.686.202 Postleitzahlen.
Die folgenden gültigen Postleitzahlen stimmen nicht überein
$pattern
:Diese Ergebnisse beziehen sich natürlich nur auf gültige Postleitzahlen, die fälschlicherweise als ungültig gekennzeichnet sind. So:
Ich sage nichts darüber, welches Muster das beste ist, um ungültige Postleitzahlen herauszufiltern.
quelle
http://regexlib.com/REDetails.aspx?regexp_id=260
quelle
0-9
Nach dieser Wikipedia-Tabelle
Dieses Muster deckt alle Fälle ab
Wenn Sie es unter Android \ Java verwenden, verwenden Sie \\ d
quelle
Die meisten Antworten hier funktionierten nicht für alle Postleitzahlen, die ich in meiner Datenbank habe. Ich habe endlich eine gefunden, die mit allen validiert, unter Verwendung des neuen regulären Ausdrucks, der von der Regierung bereitgestellt wurde:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf
Es ist in keiner der vorherigen Antworten enthalten, daher poste ich es hier, falls der Link entfernt wird:
UPDATE: Regex aktualisiert, wie von Jamie Bull gezeigt. Ich bin mir nicht sicher, ob es mein Fehler beim Kopieren oder ein Fehler in der Regex der Regierung war. Der Link ist jetzt nicht mehr verfügbar.
UPDATE: Wie ctwheels festgestellt hat, funktioniert dieser Regex mit dem Javascript-Regex-Geschmack. Siehe seinen Kommentar für einen, der mit dem pcre (php) Geschmack arbeitet.
quelle
^([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})$
sollte sein^([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})$
- den Unterschied erkennen ;-)([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})
(entfernt^
und$
und eine hinzugefügt?
nach dem Raum) für regexr.com mehr als ein Ergebnis zu finden und für beide ein Ergebnis zu finden , die keinen Raum seperator haben.(?:)
und dann um sie herum verankert werden. Sehen Sie, wie es hier fehlschlägt . Weitere Informationen finden Sie in meiner Antwort 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})|(([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}))$
ist der korrigierte reguläre Ausdruck.Ein alter Beitrag, aber immer noch ziemlich hoch in den Google-Ergebnissen, also dachte ich, ich würde aktualisieren. In diesem Dokument vom 14. Oktober wird der reguläre Ausdruck der britischen Postleitzahl wie folgt definiert:
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 geänderte Version:
Dies funktioniert mit neuen Londoner Postleitzahlen (z. B. W1D 5LH), die in früheren Versionen nicht verfügbar waren.
quelle
(?:)
und dann um sie herum verankert werden. Sehen Sie, wie es hier fehlschlägt . Weitere Informationen finden Sie in meiner Antwort 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})|(([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}))$
ist der korrigierte reguläre Ausdruck.Dies ist der reguläre Ausdruck, den Google auf seiner Domain i18napis.appspot.com bereitstellt :
quelle
Postleitzahlen können sich ändern. Die einzig wahre Möglichkeit, eine Postleitzahl zu validieren, besteht darin, die vollständige Liste der Postleitzahlen zu haben und zu prüfen, ob sie vorhanden ist.
Aber reguläre Ausdrücke sind nützlich, weil sie:
Aber reguläre Ausdrücke sind in der Regel schwer zu pflegen, insbesondere für jemanden, der sie überhaupt nicht erfunden hat. So muss es sein:
Das bedeutet, dass die meisten regulären Ausdrücke in dieser Antwort nicht gut genug sind. ZB kann ich das sehen
[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
mit einem Postleitzahlenbereich der Form AA1A übereinstimmt - aber es wird schmerzhaft sein, wenn ein neuer Postleitzahlenbereich hinzugefügt wird, da es schwierig ist zu verstehen, 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:
Im PCRE-Format kann es wie folgt geschrieben werden:
Für mich ist dies die richtige Balance zwischen einer möglichst umfassenden Validierung bei gleichzeitiger Zukunftssicherheit und einer einfachen Wartung.
quelle
aSW1A 1AAasfg
passend für mich (ich habe jedoch nicht herabgestimmt, da es so aussieht, als könnte es leicht behoben werden)Ich habe für den letzten Tag nach einer britischen Postleitzahl gesucht und bin über diesen Thread gestolpert. Ich habe mich durch die meisten der oben genannten Vorschläge gearbeitet, und keiner von ihnen hat für mich funktioniert. Deshalb habe ich mir einen eigenen regulären Ausdruck ausgedacht, der, soweit ich weiß, alle gültigen britischen Postleitzahlen ab dem 13. Januar erfasst (gemäß der neuesten Literatur von die Royal Mail).
Der reguläre Ausdruck und einige einfache PHP-Codes zur Überprüfung der Postleitzahl sind unten aufgeführt. HINWEIS: - Es ermöglicht Postleitzahlen in Klein- oder Großbuchstaben und die GIR 0AA-Anomalie. Um jedoch das Vorhandensein eines Leerzeichens in der Mitte einer eingegebenen Postleitzahl zu behandeln, wird vor dem Testen auch ein einfaches str_replace verwendet, um das Leerzeichen zu entfernen gegen die Regex. 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 eigenen Literatur der Royal Mail (Link oben) gibt es eine leichte Unklarheit in Bezug auf die 3. und 4. Position und die Ausnahmen, wenn diese Zeichen Buchstaben sind. Ich habe Royal Mail direkt kontaktiert, um es zu klären, und zwar mit eigenen Worten: "Ein Brief an der 4. Position des Outward Code mit dem Format AANA NAA hat keine Ausnahmen, und die Ausnahmen an der 3. Position gelten nur für den letzten Buchstaben des Outward Code mit dem Format ANA NAA. " Direkt aus dem Maul des Pferdes!
Ich hoffe, es hilft allen anderen, die auf diesen Thread stoßen, nach einer Lösung zu suchen.
quelle
SW1A
oderBD25
ohne die zweite Hälfte (oder zumindest für mich)Hier ist eine Regex, die auf dem Format basiert, das in den Dokumenten angegeben ist, die mit der Antwort von marcj verknüpft sind:
Der einzige Unterschied zwischen diesem und den Spezifikationen besteht darin, dass die letzten 2 Zeichen gemäß den Spezifikationen nicht in [CIKMOV] enthalten sein können.
Bearbeiten: Hier ist eine andere Version, die die Einschränkungen für nachfolgende Zeichen testet.
quelle
A-Z
- diesQ
ist niemals erlaubt,V
wird nur sparsam verwendet usw., abhängig von der Position des Charakters.Einige der oben genannten regulären Ausdrücke sind etwas restriktiv. Beachten Sie die echte Postleitzahl: "W1K 7AA" würde fehlschlagen, wenn die oben verwendete Regel "Position 3 - AEHMNPRTVXY nur verwendet" als "K" nicht zulässig wäre.
die Regex:
Scheint etwas genauer zu sein, siehe den Wikipedia-Artikel mit dem Titel "Postleitzahlen im Vereinigten Königreich" .
Beachten Sie, dass für diesen regulären 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 daran zu hindern, vollständigen Müll in die Formularfelder einzugeben. Es ist schwieriger, jede mögliche Postleitzahl richtig abzugleichen und sie zukunftssicher zu machen, und es lohnt sich wahrscheinlich nicht, es sei denn, Sie sind HMRC.
quelle
So haben wir mit dem Problem der britischen Postleitzahl umgegangen:
Erläuterung:
Dies erhält die meisten Formate. Wir verwenden 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
quelle
AANNA NAA
ungültige Format .Grundregeln:
Postleitzahlen in Großbritannien (oder Postleitzahlen, wie sie genannt werden) bestehen aus fünf bis sieben alphanumerischen Zeichen, die durch ein Leerzeichen getrennt sind. Die Regeln, nach denen Zeichen an bestimmten Positionen erscheinen können, sind ziemlich 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, können Sie Folgendes tun:
Quelle: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html
Getestet gegen unsere Kundendatenbank und scheint vollkommen genau zu sein.
quelle
Ich verwende den folgenden regulären Ausdruck, den ich gegen alle gültigen britischen Postleitzahlen getestet habe. Es basiert auf den empfohlenen Regeln, ist jedoch so weit wie möglich komprimiert und verwendet keine speziellen sprachspezifischen Regex-Regeln.
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 der Postleitzahl und der Incode akzeptiert.
Die spezielle Postleitzahl "GIR0 0AA" ist ausgeschlossen und wird nicht validiert, da sie nicht in der offiziellen Postleitzahlliste der Post enthalten ist und meines Wissens nicht als registrierte Adresse verwendet wird. Das Hinzufügen sollte bei Bedarf als Sonderfall trivial sein.
quelle
Ich wollte einen einfachen regulären Ausdruck, bei dem es in Ordnung ist, zu viel zuzulassen, aber keine gültige Postleitzahl zu verweigern. Ich habe mich dafür entschieden (die Eingabe ist eine abgespeckte Zeichenfolge):
Dies ermöglicht die kürzestmöglichen Postleitzahlen wie "L1 8JQ" sowie die längsten wie "OL14 5ET".
Da bis zu 8 Zeichen zulässig sind, sind auch falsche Postleitzahlen mit 8 Zeichen zulässig, wenn kein Leerzeichen vorhanden ist: "OL145ETX". Aber auch dies ist eine vereinfachte Regex, wenn das gut genug ist.
quelle
Erste Hälfte der Postleitzahl Gültige Formate
Ausnahmen
Position 1 - QVX nicht verwendet
Position 2 - IJZ nicht verwendet, außer in GIR 0AA
Position 3 - AEHMNPRTVXY nur verwendet
Position 4 - ABEHMNPRVWXY
Zweite Hälfte der Postleitzahl
Ausnahmen
Position 2 + 3 - CIKMOV wird 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 mit einer Liste aller gültigen Codes abzugleichen?
quelle
So überprüfen Sie, ob eine Postleitzahl in einem gültigen Format gemäß dem Programmierhandbuch von Royal Mail vorliegt :
Alle Postleitzahlen auf doogal.de überein, mit Ausnahme der nicht mehr verwendeten.
Hinzufügen eines
?
Nach-Leerzeichens und Verwenden der Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung, um diese Frage zu beantworten:quelle
Dieser erlaubt Leerzeichen und Tabulatoren von beiden Seiten, falls Sie die Validierung nicht fehlschlagen möchten, und schneidet sie dann ab.
quelle
AAA 1AA
ist kein gültiges Format: Eine Erklärung und Korrektur finden Sie in meiner Antwort .Um dieser Liste einen praktischeren regulären Ausdruck hinzuzufügen, den ich verwende, mit dem der Benutzer einen eingeben kann,
empty string
lautet:Diese Regex ermöglicht Groß- und Kleinbuchstaben 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
quelle
Schauen Sie sich den Python-Code auf dieser Seite an:
http://www.brunningonline.net/simon/blog/archives/001292.html
Ich habe es verwendet, um Postleitzahlen für mich zu verarbeiten.
quelle
Wir erhielten eine Spezifikation:
Wir haben uns Folgendes ausgedacht:
Beachten Sie jedoch, dass zwischen den Gruppen beliebig viele Leerzeichen vorhanden sind.
quelle
Ich habe den regulären Ausdruck für die Validierung der britischen Postleitzahl.
Dies funktioniert für alle Arten von Postleitzahlen, entweder innen oder außen
Dies funktioniert für alle Arten von Formaten.
Beispiel:
quelle
Die akzeptierte Antwort entspricht den Regeln von Royal Mail, obwohl der reguläre Ausdruck einen Tippfehler enthält. Dieser Tippfehler scheint auch auf der Website gov.uk vorhanden zu sein (wie auf der XML-Archivseite).
Im Format A9A 9AA erlauben die Regeln ein P-Zeichen an dritter Stelle, während der Regex dies nicht zulässt. Der richtige reguläre Ausdruck wäre:
Wenn Sie dies verkürzen, erhalten Sie den folgenden regulären Ausdruck (der die Perl / Ruby-Syntax verwendet):
Es enthält auch einen optionalen Abstand zwischen dem ersten und dem zweiten Block.
quelle
Was ich in fast allen Variationen und dem regulären Ausdruck aus dem Massenübertragungs-PDF gefunden habe und was auf der Wikipedia-Site steht, ist, dass speziell für den Wikipedia-regulären Ausdruck ein ^ nach dem ersten | (vertikaler Balken) stehen muss. Ich habe dies durch Testen auf AA9A 9AA herausgefunden, da sonst die Formatprüfung für A9A 9AA dies validiert. Zum Beispiel wird die Überprüfung auf EC1D 1BB, die ungültig sein sollte, wieder gültig, da C1D 1BB ein gültiges Format ist.
Folgendes habe ich mir für eine gute Regex ausgedacht:
quelle
Durch empirische Tests und Beobachtung sowie die Bestätigung mit https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation , hier ist meine Version einer Python , die richtig Parsen regex und validiert eine britische Postleitzahl:
UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'
Dieser reguläre Ausdruck ist einfach und verfügt über Erfassungsgruppen. Es enthält nicht alle Validierungen legaler britischer Postleitzahlen, sondern berücksichtigt nur die Positionen von Buchstaben und Zahlen.
Hier ist, wie ich es im Code verwenden würde:
Hier sind Unit-Tests:
quelle
Ich brauchte eine Version, die in SAS mit den
PRXMATCH
und verwandten Funktionen funktioniert, also habe ich mir Folgendes ausgedacht:Testfälle und Hinweise:
quelle
Die folgende Methode überprüft die Postleitzahl und liefert vollständige Informationen
quelle