2009-07-01 14 views
3

Ich habe zwei reguläre Ausdrücke, die ich benutze, um Colorado Führerscheinformate zu validieren.zwei Regex-Muster, können sie eins sein?

[0-9]{2}[-][0-9]{3}[-][0-9]{4} 

und

[0-9]{9} 

Wir haben für nur 9 Stellen zu ermöglichen, aber der Benutzer ist frei, um es als 123456789 oder 12-345-6789 eingeben in.

Gibt es eine Möglichkeit, diese in einem zu kombinieren? Wie eine regex bedingte Anweisung von Arten? Im Augenblick liste ich einfach durch alle verfügbaren Formate auf und breche aus, sobald man übereinstimmt. Ich könnte immer die Bindestriche ausziehen bevor ich den Vergleich mache und nur [0-9]{9} benutze, aber dann werde ich nichts Neues lernen.

Antwort

12

Für einen geraden kombinieren,

(?:[0-9]{2}[-][0-9]{3}[-][0-9]{4}|[0-9]{9}) 

oder die Logik (so dass Striche in einer Position ohne das andere, die möglicherweise nicht erwünscht) fusionieren, um den

[0-9]{2}-?[0-9]{3}-?[0-9]{4} 

(Die Klammern

Bindestriche in Ihrem ersten Regex machen nichts.)

Oder die Logik zusammenführen, so dass beide Bindestriche erforderlich sind, wenn einer vorhanden ist,

(?:\d{2}-\d{3}-|\d{5})\d{4} 

(Ihr [0-9] s auch mit \d s ersetzt werden kann.)

+0

Zweite Version ermöglicht einen Strich, der meiner Meinung nach nicht das gewünschte Ergebnis ist. – cletus

+0

Ja, stimmt. In Bearbeitung bemerkt. – chaos

+0

Danke. Testen Sie Ihre Beispiele hier: http://www.fileformat.info/tool/regex.htm gab mir die genauen Ergebnisse, die ich wollte. Danke auch für die Tipps zu [-] und \ d. – northpole

0

ich denke, das sollte funktionieren:

\d{2}-?\d{3}-?\d{4} 
6

Wie wäre es ein Rückreferenzierung nur mit dem zweiten Bindestrich übereinstimmen, wenn die erste gegeben:

\d{2}(-?)\d{3}\1\d{4} 

Obwohl ich nie reguläre Ausdrücke in Java verwendet habe, so dass, wenn es die Syntax unterstützt wird möglicherweise diff es. Ich habe das gerade in Ruby ausprobiert.

+1

+1: Ich würde es nicht für diesen Fall verwenden, aber ich mag die Trickiness . – chaos

+0

Die Syntax ist in Java die gleiche, aber wenn Sie sie in Form eines String-Literals schreiben, müssen Sie die Backslashes umgehen: "\\ d {2} (-?) \\ d {3} \\ 1 \\ d {4} " –

+0

Dies würde weiter funktionieren, wenn Sie' [- \\\/\ |] 'erlauben. –

3

Eine saubere Version, die entweder Striche oder keine Bindestriche erlaubt ist:

\d{2}(-?)\d{3}\1\d{4} 

Die Erfassung (die Klammern) erfassen wird entweder ‚-‘ oder nichts. Das \ 1 wird wieder übereinstimmen, was auch immer gefangen wurde.

+0

Darüber hinaus können Sie sagen, welches Format es später war, indem Sie $ 1 betrachten (zumindest in Perl). Ich hätte nie an dieses Gerät gedacht. –