Может кто-нибудь объяснить смысл этих символов. Я искал их, но, похоже, я не понимаю.
Все регулярное выражение:
/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/
В основном это начало регулярного выражения и конечных символов.
Может кто-нибудь объяснить смысл этих символов. Я искал их, но, похоже, я не понимаю.
Все регулярное выражение:
/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/
В основном это начало регулярного выражения и конечных символов.
^.* //Start of string followed by zero or more of any character (except line break)
.*$ //Zero or more of any character (except line break) followed by end of string
Итак, когда вы видите это...
(?=.*[@#$%^&+=]).*$
Это позволяет любому символу (кроме разрыва строки) находиться между (?=.*[@#$%^&+=])
и концом строки.
Чтобы показать, что .
не соответствует ни одному символу, попробуйте следующее:
/./.test('\n'); is false
Чтобы соответствовать любому персонажу, вам нужно что-то более похожее на [\s\S]
.
/[\s\S]/.test('\n') is true
.
означает "любой символ".*
означает "любое количество этого"..*
поэтому означает произвольную строку произвольной длины.^
указывает начало строки.$
указывает конец строки.Регулярное выражение говорит: может быть любое количество символов между выражением (?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])
и началом и концом искомой строки.
Основные документы: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/
12345 6 7 89
1 - start of pattern, can be almost any character, and must have a matching character at the END of the pattern (see #9 below)
2 - anchors the pattern to the start of a line of text
3 - `.` matches any character
4 - a modifier, "0 or more of whatever came before"
- `.*` means "0 or more of ANY characters"
5 - A positive lookahead assertion: http://www.php.net/manual/en/regexp.reference.assertions.php
6 - A repetition indictor: http://www.php.net/manual/en/regexp.reference.repetition.php
- `{8,}` = "at least 8 of whatever came previously"
- `.{8,}` = "at least 8 'any' characters"
7 - A character class: http://www.php.net/manual/en/regexp.reference.character-classes.php
- `[a-z]` - any one character in the range 'a' - 'z' (the lower case alphabet)
8 - anchors the pattern to the end of the line
9 - end of the pattern, must match character used in #1 above.
Это соответствует началу строки (^), за которой следует любой символ (. *):
^.*
Это соответствует концу строки ($), которому предшествует любой символ (. *):
.*$
^
соответствует началу строки
$
соответствует концу
. *
- любое количество символов
Что-то еще, что я вам помогу в будущем:
.*$
будет соответствовать два раза с учетом этой строки: "1"
Если вам интересно, почему, это потому, что он потребляет все символы, но также ничего не соответствует. Таким образом, пустая строка также является совпадением.
Это похоже на типичное регулярное выражение для проверки пароля, за исключением того, что у него есть пара ошибок. Во-первых, .*
в начале не принадлежит. Если какой-либо из этих представлений не удастся в начале строки, нет смысла применять их снова в следующей позиции, или следующей и т.д.
Во-вторых, в то время как регулярное выражение гарантирует, что каждый из этих трех видов символов присутствует, он ничего не говорит о остальной части строки. Возможно, это был преднамеренный выбор, но люди обычно стараются застраховать только те виды персонажей. В этом случае вы хотели бы изменить первый взгляд от (?=.{8,})
до (?=[[email protected]#$%^&+=]{8,}$)
.
Конечный результат:
/^(?=[[email protected]#$%^&+=]{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/