2009-10-13 3 views
107

Что такое регулярное выражение, чтобы убедиться, что данная строка содержит хотя бы один символ из каждой из следующих категорий.RegEx, чтобы убедиться, что строка содержит хотя бы один символ нижнего регистра, символ верхнего регистра, цифру и символ

  • Строчного характер
  • Прописного характер
  • Digit
  • Symbol

Я знаю, что шаблоны для отдельных наборов, а именно [a-z], [A-Z], \d и _|[^\w] (я получил их правильно, Ждет» t I?).

Но как их объединить, чтобы убедиться, что строка содержит все их в любом порядке?

+0

Какая платформа/диалект regex? Ответ Барта прав, но, например, надежные утверждения ненадежны в JavaScript. – bobince

+0

Нигде в частности - я изучаю регулярное выражение. Есть ли альтернатива, которая может использоваться в javascript? – Amarghosh

+0

@bobince Эй, я пытаюсь выяснить, почему утверждения lookahead не надежны в Javascript. Есть ли запись по этому поводу? –

ответ

250

Если вам нужен один единственный регулярное выражение, попробуйте:

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

краткое объяснение:

^     // 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 

И я согласен с SilentGhost, [_\W] может быть немного широким. Я бы заменил его набором символов, подобным этому: [[email protected]#$%^&*.,?] (не стесняйтесь добавлять больше, конечно!)

+5

Еще раз спасибо Барт. Я не знал о позитивном взгляде. – Amarghosh

+0

Что произойдет, если я изменю последний '. +' На '. *'? Я не мог придумать тестовый пример, который терпит неудачу с '. *'. В этом контексте они одинаковы? «Нуль или больше символов», похоже, все в порядке - просто ищет подтверждение. – Amarghosh

+0

@Amarghosh: в этом случае это не имеет значения. Из-за положительного внешнего вида строка уже содержит не менее 4 символов. Поэтому не имеет значения, чтобы изменить '. +' На '. *' Или даже '. {4,}' в этом отношении. –

4

Вы можете сопоставить эти три группы отдельно и убедиться, что все они присутствуют. Кроме того, [^\w] кажется немного слишком широким, но если это то, что вы хотите, вы можете заменить его \W.

+0

Спасибо. Я не знал о \ W. Просто посмотрел на него, чтобы найти, что он соответствует не Word. Есть ли разница между \ W и [\ W]? Является ли [\ W] избыточным? – Amarghosh

+0

@Amarghosh, да, '\ W' и' [\ W] 'приводят к тому же. –

2

Bart Kiers, ваше регулярное выражение имеет пару вопросов. Лучший способ сделать это заключается в следующем:

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

Таким образом, вы ищете, независимо от того, если в самом начале, в конце или в середине. У вас есть много проблем со сложными паролями.

Смежные вопросы