RegEx เพื่อให้แน่ใจว่าสตริงมีอักขระตัวพิมพ์เล็กอย่างน้อยหนึ่งตัวอักขระตัวพิมพ์ใหญ่ตัวเลขและสัญลักษณ์


156

regex คืออะไรเพื่อให้แน่ใจว่าสตริงที่กำหนดมีอักขระอย่างน้อยหนึ่งตัวจากแต่ละหมวดหมู่ต่อไปนี้

  • อักขระตัวพิมพ์เล็ก
  • ตัวพิมพ์ใหญ่
  • หลัก
  • สัญลักษณ์

ฉันรู้ว่ารูปแบบสำหรับแต่ละชุดคือ[a-z], [A-Z], \dและ_|[^\w](ฉันได้พวกเขาแก้ไขไม่ได้ฉัน?)

แต่ฉันจะรวมมันเพื่อให้แน่ใจว่าสตริงมีสิ่งเหล่านี้ในลำดับใด ๆ ได้อย่างไร


แพลตฟอร์ม / ภาษา regex อะไร คำตอบของ Bart นั้นถูกต้อง แต่ตัวอย่างเช่นการยืนยันแบบ lookahead นั้นไม่น่าเชื่อถือใน JavaScript
464 bobince

ไม่มีที่ไหนเลยโดยเฉพาะ - ฉันกำลังเรียนรู้ regex มีทางเลือกอื่นที่สามารถใช้ในจาวาสคริปต์ได้หรือไม่?
Amarghosh

@Bobince เฮ้ฉันพยายามค้นหาว่าทำไมการอ้างสิทธิ์ lookahead จึงไม่น่าเชื่อถือใน Javascript มีการเขียนเกี่ยวกับเรื่องนี้หรือไม่?
Chris Bier

@ChrisB: มีข้อผิดพลาด IE / JScript ที่สับสนจริงๆ: blog.stevenlevithan.com/archives/regex-lookahead-bug
bobince

คำตอบ:


350

หากคุณต้องการ regex เพียงตัวเดียวให้ลอง:

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

คำอธิบายสั้น ๆ :

(?=.*[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

และฉันเห็นด้วยกับ SilentGhost \Wอาจจะค่อนข้างกว้าง ฉันจะแทนที่ด้วยชุดอักขระเช่นนี้: [-+_!@#$%^&*.,?](อย่าลังเลที่จะเพิ่มแน่นอน!)


จะเกิดอะไรขึ้นถ้าฉันเปลี่ยนคนสุดท้าย.+เป็น.*? ฉันไม่สามารถคิดกรณีทดสอบที่ล้มเหลว.*ได้ พวกเขาเหมือนกันในบริบทนี้หรือไม่? "ตัวละครที่เป็นศูนย์หรือมากกว่านั้น" ดูเหมือนจะใช้ได้ - เพียงแค่ขอการยืนยัน
Amarghosh

@Amarghosh: ในกรณีนี้มันไม่ได้สร้างความแตกต่าง เนื่องจากการบวกหัวค้นหาสตริงจึงมีอักขระอย่างน้อย 4 ตัว ดังนั้นจึงไม่มีความแตกต่างในการเปลี่ยน.+เป็น.*หรือแม้แต่.{4,}เรื่องนั้น
บาร์ต Kiers

หากคุณยินดีที่จะเพิ่มคำอธิบายเล็ก ๆ น้อย ๆ ฉันมีปัญหาในการเข้าใจว่าการรวมกันของ lookaheads เหล่านี้รับประกันได้อย่างน้อย 1 ของชุดตัวละครแต่ละตัวจะนำเสนอ
Sharlike

@ เหมือนกันฉันไม่รู้วิธีการใช้ถ้อยคำใหม่เพื่อให้เข้าใจได้ง่ายขึ้น โดยเฉพาะในกล่องแสดงความคิดเห็นขนาดเล็กเหล่านี้ ฉันขอแนะนำให้คุณอ่านนี้: regular-expressions.info/lookaround.htmlและหากคุณยังมีคำถามให้โพสต์คำถามของคุณเอง โชคดี!
บาร์ต Kiers

4
@ikertxu ลองทำสิ่งนี้:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
Bart Kiers

20

Bart Kiers, regex ของคุณมีปัญหาสองสามข้อ วิธีที่ดีที่สุดในการทำเช่นนี้คือ:

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

ด้วยวิธีนี้คุณกำลังค้นหาไม่ว่าจะเป็นตอนต้นตอนจบหรือตอนกลาง ในการมีของคุณฉันมีปัญหามากมายกับรหัสผ่านที่ซับซ้อน


5
คุณไม่ได้ตรวจสอบสัญลักษณ์ตามที่ OP ร้องขอ
เมียร์เมียร์

5

คุณสามารถจับคู่ทั้งสามกลุ่มแยกกันและตรวจสอบให้แน่ใจว่าพวกเขาทั้งหมดนำเสนอ นอกจากนี้[^\w]ดูเหมือนว่าบิตกว้างเกินไป \Wแต่ถ้านั่นคือสิ่งที่คุณต้องการคุณอาจต้องการที่จะแทนที่ด้วย


ขอบคุณ ฉันไม่รู้ \ W เพิ่งค้นหาเพื่อพบว่าตรงกับ Not Word มีความแตกต่างระหว่าง \ W กับ [\ W] หรือไม่? [\ W] ซ้ำซ้อนหรือไม่
Amarghosh

@ Amarghosh ใช่\Wและ[\W]ผลลัพธ์เหมือนกัน
464 Bart Kiers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.