2009-10-13 6 views
107

Was ist die Regex, um sicherzustellen, dass eine bestimmte Zeichenfolge mindestens ein Zeichen aus jeder der folgenden Kategorien enthält.RegEx, um sicherzustellen, dass die Zeichenfolge mindestens ein Kleinbuchstabe, Großbuchstaben, Ziffer und Symbol enthält

  • Klein Charakter
  • Versalien- Charakter
  • Digit
  • Symbol

Ich weiß, dass die Muster für einzelne Sätze nämlich [a-z], [A-Z], \d und _|[^\w] (ich habe sie richtig, didn‘ t ich?).

Aber wie kombiniere ich sie, um sicherzustellen, dass die Zeichenfolge all diese in beliebiger Reihenfolge enthält?

+0

Welche Plattform/Regex-Dialekt? Bart's Antwort ist richtig, aber Lookahead-Behauptungen sind beispielsweise in JavaScript nicht zuverlässig. – bobince

+0

Nirgendwo besonders - ich lerne Regex. Gibt es eine Alternative, die in Javascript verwendet werden kann? – Amarghosh

+0

@bobince Hey, ich versuche herauszufinden, warum Lookahead Assertions in Javascript nicht zuverlässig sind. Gibt es eine Aufschrift darüber? –

Antwort

250

Wenn Sie eine einzelne Regex benötigen, versuchen:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$ 

eine kurze Erklärung:

^     // the start of the string 
(?=.*[a-z])  // use positive look ahead to see if at least one lower case letter exists 
(?=.*[A-Z])  // use positive look ahead to see if at least one upper case letter exists 
(?=.*\d)   // use positive look ahead to see if at least one digit exists 
(?=.*[_\W])  // use positive look ahead to see if at least one underscore or non-word character exists 
.+     // gobble up the entire string 
$     // the end of the string 

Und ich stimme mit SilentGhost, [_\W] vielleicht ein bisschen breit sein. Ich würde es mit einem Zeichensatz wie folgt ersetzen: [[email protected]#$%^&*.,?] (Fühlen Sie sich frei, natürlich mehr hinzuzufügen!)

+5

Danke nochmal Bart. Ich war mir der positiven Vorausschau nicht bewusst. – Amarghosh

+0

Was würde passieren, wenn ich das letzte '. +' In '. *' Ändere? Ich konnte keinen Testfall finden, der mit '. *' Versagt. Sind sie in diesem Zusammenhang gleich? "Null oder mehr Zeichen" scheint in Ordnung zu sein - nur Bestätigung suchen. – Amarghosh

+0

@Amarghosh: In diesem Fall macht es keinen Unterschied. Aufgrund der positiven Vorausschau enthält die Zeichenfolge bereits mindestens 4 Zeichen. Es macht also keinen Unterschied, '. + 'In'. * 'Oder sogar'. {4,} 'zu ändern. –

4

Sie können diese drei Gruppen separat abstimmen und sicherstellen, dass alle vorhanden sind. Auch scheint [^\w] ein bisschen zu breit, aber wenn das ist, was Sie wollen, möchten Sie es vielleicht durch \W ersetzen.

+0

Danke. Ich war nicht bewusst, \ W. Ich habe einfach nachgesehen, dass es mit Nicht-Wort übereinstimmt. Gibt es einen Unterschied zwischen \ W und [\ W]? Ist [\ W] nur überflüssig? – Amarghosh

+0

@Amarghosh, ja, '\ W' und' [\ W] 'ergeben das gleiche. –

2

Bart Kiers, Ihre Regex hat ein paar Probleme. Der beste Weg, das zu tun, ist dies:

(.*[a-z].*)  // For lower cases 
(.*[A-Z].*)  // For upper cases 
(.*\d.*)   // For digits 

Auf diese Weise können Sie ganz gleich, ob am Anfang suchen, am Ende oder in der Mitte. In Ihrem Fall habe ich viele Probleme mit komplexen Passwörtern.

Verwandte Themen