2016-12-19 18 views
2

Ich arbeite derzeit an einem Regex, die genau 8 Ziffern entsprechen muss. Aber manchmal kommt es vor, dass zwischen diesen Zahlen Leerzeichen oder Punkte liegen. Dies ist die Regex, die ich gerade benutze.Regex passen bestimmte Anzahl von Zeichen und ermöglichen Leerzeichen zwischen

([0-9\ ?.?]{7,16}) 

Es arbeitet die meiste Zeit in Ordnung, aber das Problem, das ich habe ist, dass es sie so erhalten Sie so etwas wie 1.234/s/s/s/s manchmal passt Zahl mit viel Raum tailing (/ s steht für space) Oder manchmal sind es nur passende Leerzeichen.

Was ich will ist eine Regex, die immer mindestens 8 Ziffern übereinstimmt und auch Leerzeichen und Punkte erlaubt, ohne weniger als 8 Ziffern zu erkennen. Ich weiß, dass es eine dumme Frage ist, aber ich konnte nirgendwo etwas finden, was ich brauche.

+1

Also, * genau ** übereinstimmen ** 8 Ziffern * oder * eine Regex, die immer ** mindestens ** 8 Ziffern * entspricht? –

+1

Warum ersetzen Sie nicht alles andere als Ziffern durch eine leere Zeichenfolge und überprüfen Sie die Länge der neuen Zeichenfolge? – TheLostMind

+0

muss es extactlly 8 Ziffern sein –

Antwort

3

Der Ausdruck ([0-9\ ?.?]{7,16}) entspricht 7 bis 16 Vorkommen eines beliebigen Zeichens, das entweder eine Ziffer oder ein Leerzeichen oder ? oder . ist. Ja, die ? innerhalb [...] ist ein Literal ?, kein Quantor.

Sie benötigen einen Ausdruck zu verwenden, die eine Ziffer ([0-9]) und dann genau 7 Sequenzen eines Raumes oder Zeit ([ .]), gefolgt mit 1 Stelle übereinstimmen, und um sicherzustellen, dass Sie nicht die Ziffern in 123.156.78.146 passend können Sie verwenden spezielle Grenzen:

(?<!\d[ .]?)\d(?:[. ]?\d){7}(?![ .]?\d) 

wenn der Raum oder . nur 0 auf 1 in zwischen den Ziffern sein können; oder - wenn der Raum/kann Punkt erscheinen 0 oder mehrmals,

(?<!\d[ .]*)\d(?:[. ]*\d){7}(?![ .]*\d) 

Siehe regex demo

Die (?<!\d[ .]*) eine negative Lookbehind ist, dass jedes Spiel wird scheitern, wenn es mit einer Ziffer beginnt, die mit . folgten (s) oder Leerzeichen, und der negative Lookahead (?![ .]*\d) schlägt die Übereinstimmung fehl, wenn die 7 Ziffern, die Sie benötigen, mit . (s) oder Leerzeichen (s) und einer Ziffer gefolgt werden.

1

Um dies zu lösen, beschreiben Sie das Problem für sich. Sie möchten eine Ziffer gefolgt von sieben Wiederholungen von Leerzeichen oder Punkt gefolgt von einer Ziffer zuordnen. Dies führt zu einem regulären Ausdruck wie \d([ .]?\d){7}. Um das Sammeln der sieben Aufnahmen zu vermeiden, fügen Sie nach der ( eine :? hinzu. Um die ganze Zeichenfolge zu erfassen, schließen Sie sie in Klammern ein. Das Hinzufügen beider Änderungen ergibt den Ausdruck (\d(:?[ .]?\d){7}). Wenn mehr als ein Leerzeichen oder Punkt zwischen den Ziffern zulässig ist, ändern Sie die ? in eine *.

Um nur die acht Ziffern aus der Zeichenfolge zu erhalten, empfehle ich, die oben aufgezeichnete Zeichenfolge zu verwenden und Leerzeichen oder Punkte durch nichts zu ersetzen.

Verwandte Themen