RegEx, щоб переконатися, що рядок містить щонайменше одну нижню літеру, верхній регістр, цифру та символ


156

Що таке регулярний вираз, щоб переконатися, що даний рядок містить принаймні один символ із кожної з наступних категорій.

  • Малі символи
  • Великий символ
  • Цифрова
  • Символ

Я знаю , що шаблони для окремих наборів , а саме [a-z], [A-Z], \dі _|[^\w](я отримав їх виправити, чи не так чи що?).

Але як я їх поєдную, щоб переконатися, що рядок містить усе це в будь-якому порядку?


Яка платформа / регулярний діалект? Відповідь Барта правильна, але, наприклад, твердження lookahead не є надійними в JavaScript.
bobince

Ніде зокрема - я вчу регекс. Чи існує альтернатива, яку можна використовувати в JavaScript?
Amarghosh

@bobince Ей, я намагаюся з'ясувати, чому твердження lookahead не є надійними у Javascript. Чи є запис на це?
Кріс Бір

@ChrisB: По-справжньому заплутана IE / JScript помилка: blog.stevenlevithan.com/archives/regex-lookahead-bug
bobince

Відповіді:


349

Якщо вам потрібен один єдиний вираз, спробуйте:

(?=.*\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,}із цього питання.
Барт Кіерс

Якщо ви хочете додати трохи пояснень, у мене виникають проблеми з розумінням того, як комбінація цих
штрихових головок

@Sharlike, я не знаю, як перефразовувати це, щоб полегшити його розуміння. Особливо в цих невеликих скриньках для коментарів. Я рекомендую вам прочитати це: regular-expressions.info/lookaround.html, і якщо у вас все ще виникають питання, просто опублікуйте власне запитання. Удачі!
Барт Кіерс

4
@ikertxu, спробуйте щось подібне:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
Барт Кіерс

20

Барт Кірс, ваш регекс має кілька питань. Найкращий спосіб зробити це:

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

Таким чином ви шукаєте незалежно від того, на початку, наприкінці чи в середині. У вас є багато проблем зі складними паролями.


5
Ви не перевіряєте символи, як вимагає ОП.
Казимир

5

Ви можете зіставити ці три групи окремо і переконатися, що вони всі присутні. Також [^\w]здається трохи надто широким, але якщо це те, що ви хочете, ви можете замінити його \W.


Дякую. Я не знав \ W. Просто подивився на нього, щоб виявити, що він відповідає Word. Чи є різниця між \ W і [\ W]? Чи [\ W] просто зайве?
Amarghosh

@Amarghosh, так, \Wі [\W]результат - те саме.
Барт Кіерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.