2017-10-28 1 views
0

Ich bestätige eine Postleitzahl in Großbritannien mit dem Regex-Muster supplied by the British government. Mein Test sieht derzeit wie folgt aus:Die gesamte Zeichenfolge mit Regex abgleichen

const postcodeRegex = /^([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})$/g; 

console.log(postcodeRegex.test('s75ed')); // returns true 
console.log(postcodeRegex.test('s75ed555555')); // returns false 
console.log(postcodeRegex.test('555555s75ed')); // returns true 

Die ersten 2 Konsolenprotokolle korrekt sind, aber ich erwartete das dritte falsch zurück. Der Test gibt "true" zurück, wenn das Muster am Ende der Zeichenfolge gefunden wird. Dies ermöglicht jedoch jeden Jibberish am Anfang der Zeichenfolge, was bedeutet, dass die gesamte Zeichenfolge insgesamt eine ungültige Postleitzahl ist.

Wie kann ich das Muster strikt an die gesamte Zeichenfolge anpassen?

+0

Ist das Muster direkt von der britischen Regierung kopiert? Wenn das so ist, bin ich überrascht, dass sie das nicht selbst getestet haben. Scheint mehrere Fehler zu haben: o) – agrm

+0

@agrm Ja direkt von einem Dokument auf der .gov Website veröffentlicht. Unglaublich, ich weiß, aber so etwas macht die Regierung. – Coop

+0

@agrm Ich habe einen Link zum PDF hinzugefügt. – melpomene

Antwort

3

Ihre regex hat diese Form: ^A|B$. Es scheint, dass Sie nicht erwartet haben, dass dies Agibberish und gibberishB entspricht, und Sie suchen eigentlich nach ^(A|B)$. Auf diese Weise geschrieben, es wird nur übereinstimmen A oder B, es wird nicht übereinstimmen Agibberish und gibberishB.

Btw dieser Teil der Regex sieht aus wie ein Fehler: [AZa-z]. Sie wahrscheinlich [A-Za-z] gemeint.

Und in der Tat erscheinen alle Buchstaben in der Regex in Groß- und Kleinbuchstaben. So könnte man durch einiges vereinfachen, wenn Sie die i Flags hinzufügen und einen der Fälle beseitigen:

const postcodeRegex = /^((gir 0a{2})|((([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}))$/gi; 
+0

Großartig, das löst mehr Probleme, als ich dachte, existierte. Vertrauen Sie der Regierung, ein falsches Muster dafür zu liefern. – Coop

+0

Auch die korrigierte Regex validiert eine Postleitzahl nicht vollständig. Einige Buchstaben, z. B. Q, können nicht in der ersten Position angezeigt werden. Der Buchstabe I wird nie benutzt. Nur bestimmte Kombinationen sind gültig. Der Bezirk G in der ersten Position ist in Ordnung, aber nur GL, GU und GY sind mit zweiten Buchstaben gültig. Und so weiter. – Nick

2

Wenn wir einige Leerzeichen und Vertiefung hinzufügen, sieht Ihre Regex wie folgt aus:

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

D.h. nur die erste Alternative ist am Anfang der Zeichenfolge verankert (^), und nur die zweite Alternative ist am Ende der Zeichenfolge verankert ($). Statt

Sie können das Ganze in einer (nicht Capturing) Gruppe wickeln:

^(?:...|...)$ 
+1

Brilliant, scheint die neue Gruppierung das Problem zu lösen. Ich bin überrascht, dass die britische Regierung öffentlich ein falsches Regex-Muster dafür teilt ... Moment mal, ich bin überhaupt nicht überrascht. – Coop

Verwandte Themen