2015-02-08 25 views
5

Ich versuche, eine regex zu erstellen Benutzernamen zu überprüfen, die die folgenden entsprechen sollte:Regex übereinstimmen einen Benutzernamen

  • Nur eine spezielle char (._-) erlaubt und es darf nicht
  • an den Extremwerten des Strings sein das erste Zeichen darf keine Zahl
  • sein, die alle anderen Zeichen sind Buchstaben und Zahlen erlaubt
  • die Gesamtlänge sollte
  • zwischen 3 und 20 Zeichen sein

Dies ist für ein HTML5-Validierungsmuster, so dass es leider ein großer Regex sein muss.

Bisher ist das, was ich habe:

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20} 

Aber die positive Vorschau kann mehr als einmal wiederholt werden, so dass mehr als ein Sonderzeichen sein, das ist nicht das, was ich wollte. Und ich weiß nicht, wie ich das korrigieren soll.

+0

noch keine Antwort - aber Sie müssen brechen '.' in' [._-] '. – amit

+0

Für etwas so kompliziert, warum wählen Sie mit einem HTML-Validierungsmuster gehen? Sie könnten ein Ereignis auslösen, das die Validierung und nicht das Muster behandelt. – Eclecticist

+0

@amit [._-] ist ein einzelnes Zeichen in der Liste "._-" wörtlich so der Punkt wird nicht als ein Zeichen, so denke ich, ich brauche es nicht zu brechen – Tofandel

Antwort

14

Sie sollten Ihre regex in zwei Teile geteilt, um Ihren Live einfacher (nicht zwei Ausdrücke!):

Zuerst passen das Format der Benutzername haben muss: ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

Jetzt müssen wir nur noch die Längenbeschränkung validieren. Um arround zu verwirren nicht mit den bereits gefundenen Mustern können Sie ein nicht-verbrauchenden Spiel verwenden, die nur die Anzahl der Zeichen bestätigt (seine litterally einen Hack für die Schaffung ein und Muster für Ihren regulären Ausdruck): (?=^.{3,20}$)

Die Regex versucht nur dann, das gültige Format zu finden, wenn die Längenbeschränkung übereinstimmt. Es ist nicht konsumierend, und nachdem es erfolgreich ist, befindet sich der Motor immer noch am Anfang der Saite.

so, alle zusammen:

(?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$ 

Regular expression visualization

Debuggex Demo

+1

Danke Meister der Regex, das funktioniert (ich musste nur die letzte * durch ein + ersetzen, so kann ein spezielles Zeichen nicht am Ende sein – Tofandel

+1

@ Adri1du40 bemerkte das auch. (Und schon behoben) – dognose

0

Ich denke, Sie müssen ? anstelle von + verwenden, so dass das Sonderzeichen nur einmal oder nicht übereinstimmt.

^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

+0

Das würde nur ein Sonderzeichen erlauben am Anfang der Zeichenfolge zu sein – Tofandel

+0

@ Adri1du40 Bist du sicher? Ich denke '' '' ist im Grunde genommen '+', außer dass es nur nullmal oder einmal übereinstimmt. –

+0

Ja, das ist was? tut aber wenn du ein Zeichen vor dem speziellen Zeichen nullmal sein lässt, dann kann am Anfang ein spezielles Zeichen stehen – Tofandel