Dizenin en az bir küçük harf karakter, büyük harf karakter, rakam ve sembol içerdiğinden emin olmak için RegEx


156

Belirli bir dizenin aşağıdaki kategorilerin her birinden en az bir karakter içerdiğinden emin olmak için normal ifade nedir?

  • Küçük harf
  • Büyük harf karakter
  • Hane
  • sembol

Ben yani bireysel setleri için desenler biliyorum [a-z], [A-Z], \dve _|[^\w](ben onları düzeltmek lazım değil mi?).

Ancak, dizenin tüm bunları herhangi bir sırada içerdiğinden emin olmak için onları nasıl birleştirebilirim?


Hangi platform / normal ifade lehçesi? Bart'ın yanıtı doğru, ancak ileriye dönük iddialar JavaScript'te güvenilir değil.
bobince

Özellikle hiçbir yerde - regex öğreniyorum. Javascript'te kullanılabilecek bir alternatif var mı?
Amarghosh

@bobince Hey, Javahcript'te ileriye dönük iddiaların neden güvenilir olmadığını anlamaya çalışıyorum. Bu konuda bir yazı var mı?
Chris Bier

@ChrisB: gerçekten kafa karıştırıcı IE / JScript hata var: blog.stevenlevithan.com/archives/regex-lookahead-bug
bobince

Yanıtlar:


350

Tek bir normal ifadeye ihtiyacınız varsa şunları deneyin:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)

Kısa bir açıklama:

(?=.*[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 non-word character exists

Ve SilentGhost ile hemfikirim, \Wbiraz geniş olabilir. Bunu şöyle bir karakter setiyle değiştirirdim: [-+_!@#$%^&*.,?](elbette daha fazlasını eklemekten çekinmeyin!)


Ben geçen değiştirmek ne olur .+INTO .*? Başarısız olan bir test vakası bulamadım .*. Bu bağlamda aynı mı? "Sıfır veya daha fazla karakter" iyi görünüyor - sadece onay istiyor.
Amarghosh

@Amarghosh: bu durumda fark etmez. Olumlu görünümler nedeniyle, dize zaten en az 4 karakter içeriyor. Bu yüzden değişime hiç farketmez .+içine .*ve hatta .{4,}bu konuda.
Bart Kiers

Biraz açıklama eklemek isteyecek olursanız, bu
gözetleme

@Sharlike, anlamayı kolaylaştırmak için nasıl yeniden ifade edeceğimi bilmiyorum. Özellikle bu küçük yorum kutularında. Bunu okumanızı tavsiye ederim: regular-expressions.info/lookaround.html ve hala sorunuz varsa, kendi sorunuzu gönderin. İyi şanslar!
Bart Kiers

4
@ikertxu, böyle bir şey deneyin:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
Bart Kiers

20

Bart Kiers, normal ifadenizin birkaç sorunu var. Bunu yapmanın en iyi yolu şudur:

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

Bu şekilde, başlangıçta, sonunda veya ortasında olsun, arama yaparsınız. Senin içinde karmaşık şifrelerle bir çok sıkıntı var.


5
OP'nin istediği gibi sembolleri kontrol etmiyorsunuz.
Casimir

5

Bu üç grubu ayrı ayrı eşleştirebilir ve hepsinin bulunduğundan emin olabilirsiniz. Ayrıca, [^\w]biraz fazla geniş görünüyor, ancak eğer istediğiniz buysa, onunla değiştirmek isteyebilirsiniz \W.


Teşekkürler. \ W'nin farkında değildim. Not Word ile eşleştiğini bulmak için baktım. \ W ve [\ W] arasında herhangi bir fark var mı? [\ W] sadece gereksiz mi?
Amarghosh

@Amarghosh, evet \Wve [\W]sonuç aynı.
Bart Kiers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.