2010-06-21 4 views
1

Я пишу регулярное выражение для проверки пароля в Javascript. Эти ограничения являются:Регулярное выражение Javascript для пароля

  1. Пароль должен содержать по крайней мере один символ верхнего регистра
  2. Пароль должен содержать по крайней мере специальный символ

С проб и ошибок и некоторых поисков в сети, я обнаружил, что это работы:

/(?=.*[A-Z]+)(?=.*[[email protected]#\$%]+)/ 

может кто-то пожалуйста, объясните часть этого выражения, которое упоминает о том, что прописные буквы и специальные символы могут прийти в любом порядке?

+1

вам не нужны плюсовые кванторы. И почему вы избегаете '*'? – SilentGhost

+0

Прошу прощения ... избежал * из-за проблем с форматированием. Он не появился, когда я разместил его первым. Мысль, возможно, разметка присваивает особое значение и, следовательно, избегает ее. – atlantis

+0

ОК, давайте просто забудем об этом. – SilentGhost

ответ

2

Я думаю, что это будет работать еще лучше:

/(?=.*[A-Z])(?=.*[[email protected]#\$%])/ 

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

следующее регулярное выражение (предложенный Gumbo) является немного более эффективным, так как это позволяет избежать ненужного откаты:

/(?=[^A-Z]*[A-Z])(?=[^[email protected]#\$%]*[[email protected]#\$%])/ 

На пароли обычных длин разница во времени, вероятно, не будет легко измерить, хотя.

+0

Я думаю, что '+' является одним из желаемых специальных символов. Вместо того, чтобы полностью удалить его, он должен быть в символьном классе '[]' –

+0

@Richard: plus также используется в первом поиске, поэтому я думаю, что он используется как квантификатор. Это не совсем неправильно, это просто лишнее. – SilentGhost

+0

@SilentGhost - Это правда; Я не заметил его в первом. –

1

«? =» Делает это. Это «положительный предпросмотр»

От JavaScript Regular Expression Syntax

Положительное опережение соответствует строке поиска в любой точке, где начинается шаблон строки соответствия. Это не захватывающее совпадение, т. Е. Совпадение не выполняется для возможного последующего использования. Например, «Windows (? = 95 | 98 | NT | 2000)» соответствует «Windows» в «Windows 2000», но не «Windows» в «Windows 3.1». Lookaheads не потребляют персонажей, то есть после того, как происходит совпадение, поиск следующего матча начинается сразу после последнего совпадения, а не после символов, которые содержат lookahead.

+0

Спасибо. В ответе Silentghost есть подробности. – atlantis

+0

Эта ссылка очень полезна ... еще раз спасибо! – atlantis

2

?= называется lookahead, где он сканирует остальную часть строки, чтобы узнать, найдено ли совпадение. Обычно регулярное выражение переходит по символу, но ?= сообщает «lookahead», чтобы узнать, существует ли он.

Существует также негативный взгляд ?!.

+0

Спасибо. В ответе Silentghost есть подробности. – atlantis

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