2015-05-30 4 views
5

Soweit ich weiß {} geschweiften Klammern verwendet werden, wie {3,12} in regulärem Ausdruck Zeichen zu begrenzen, würden Zeichenlänge Übereinstimmen zwischen 3 bis 12wie zu begrenzen, Zeichen zwischen einem Bereich mit regulärem Ausdruck

ich versuche zu Validiere den Benutzernamen, der einen Punkt . oder _ entweder einen, aber nicht beides enthalten könnte. Dafür funktioniert der unten stehende Regex sehr gut.

(^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$) 

Aber ich muss auch die String-Länge zwischen 3 bis 12 begrenzen, hatte ich versucht, {3,12} in regex zu setzen, aber das funktioniert nicht.

((^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$)){3,12} 

Siehe Beispiel: https://regex101.com/r/kN3aO1/1

+0

Eine Menge los mit dem ausgewählten Ausdruck '^ (? =. {3,12} $) [a-z0-9] + (?: [._] [a-z0-9] +)? $ Abgesehen von der Vorausschau bis zur Valdate-Länge, siehst du die anderen feinen Unterschiede von deiner ursprünglichen Regex? – sln

+0

Ich hatte '|' verwendet, um String mit Nicht-Periode oder Unterstrich und umgekehrt zu differenzieren, wie auch immer ich denke, hwnd Ausdruck ist besser als Minen als er nicht verwendet oder –

Antwort

3

Als hwnd vorgeschlagen, eine einfachere Lösung wäre:

^(?=.{3,12}$)[a-z0-9]+(?:[._][a-z0-9]+)?$ 

Alte Lösung, die ziemlich komplex und verworren ist, wird hier als Referenz links , aber benutze stattdessen das obige.

^(?!(?:.{13,}|.{1,2})$)(?:([a-z0-9]+)|([a-z0-9]*[\.\_][a-z0-9]*))$ 

Sie können ein Lookahead hinzufügen.

Demo on regex101

+2

würde ich wahrscheinlich '^ (? =. { 3,12} $) [a-z0-9] + (?: [._] [a-z0-9] +)? $ Stattdessen. – hwnd

+0

@hwnd ja ..........nur verwendet OP Regex – vks

+1

Funktioniert wie ein Charme! Danke –

0

Ich würde diese Schritte in drei tun.

  1. Überprüfen Sie, ob die Zeichenfolge ein '/' enthält.
  2. Überprüfen Sie, ob die Zeichenfolge ein '_' enthält.
  3. Überprüfen Sie, ob String-Länge zwischen 3 und 12.

In Perl ist:

if ((($name =~ /_/) && ($name =~ /\./)) || 
    (length($name) < 3) || 
    (length($name) > 12)) 
{ 
    # Handle invalid username 
} 

Wenn Sie sicherstellen möchten, dass der Benutzername enthält nur ein Punkt oder unterstreichen Sie können sie zählen. Auch in Perl:

my $dcnt = $name =~ tr /././; 
my $ucnt = $name =~ tr /_/_/; 

if (($dcnt > 0 && $ucnt > 0) || 
    ($dcnt > 1)   || 
    ($ucnt > 1)   || 
    (length($name) < 3) || 
    (length($name) > 12)) 
{ 
    # Handle invalid username 
} 

Warum nicht ein Monster regulären Ausdruck, der alles auf einmal tut? Nun, aus Gründen der Wartbarkeit. Wenn Sie oder ein Kollege diesen Code in einem Jahr betrachten, wenn sich die Anforderungen geändert haben, erleichtert dieser Ansatz die Aktualisierung des Codes.

Beachten Sie auch, dass {3,12} nichts über Längen sagt. Es ermöglicht, dass das vorherige Muster drei bis zwölf Mal übereinstimmt.

Verwandte Themen