我无法制作一些正则表达式模式,因此我搜索了大部分模式,并在此过程中遇到了问题。我主要理解构建正则表达式模式时的游戏规则,但不了解如何创建正则表达式,以检查字符串中是否至少有1种特定类型的字符。这是我在网上找到的:
'/^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})$/'
我无法理解的是:
?=.*
来说是什么意思,它意味着什么在一起或只是单独的属性.
).{
据我知道它的任何字符,除非它意味着前面提到的任何一个但是是什么使它以这种方式工作ąó
或"(^!
这样的内容看到任何提到角色的地方正如你已经想到的那样,我试图构建密码验证正则表达式并努力解决这个问题。
修改
如果有可能有人对此正则表达式进行更改,那么这并不意味着
因此它意味着
答案 0 :(得分:1)
(?=...)
是positive lookahead assertion。它断言所包含的正则表达式可以匹配当前位置而不实际执行匹配。例如,(?=.*\d)
表示"检查是否可以匹配任意数量的字符,然后是数字"转换为"检查字符串中前面是否至少有一个数字"。
打破正则表达式,这意味着:
^ # Start of string
( # Match and capture in group 1:
(?=.*\d) # Assert that there is at least one digit in the string
(?=.*[a-z]) # Assert that there is at least one lowercase letter in the string
(?=.*[A-Z]) # Assert that there is at least one uppercase letter in the string
(?=.*[@#$%]) # Assert that there is at least one of the characters @#$%
.{6,20} # Match 6-20 characters (any character except newlines)
) # End of group
$ # End of string
顺便说一句,捕获组完全没必要。
答案 1 :(得分:0)
/^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})$/
的开头断言位置
^
在字符串第一个捕获小组
((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})
(?=.*\d)
肯定前瞻 - 断言下面的正则表达式可以匹配任意数量的任何字符,后跟数字。换句话说,字符串必须包含数字。
(?=.*[a-z])
肯定前瞻 - 断言下面的正则表达式可以匹配任意数量的任何字符,后跟a和z之间的单个字符(区分大小写)。换句话说,string必须包含小写字符。
(?=.*[A-Z])
肯定前瞻 - 断言下面的正则表达式可以匹配任意数量的任何字符,后跟A和Z之间的单个字符(区分大小写)。换句话说,string必须包含一个大写字符。
(?=.*[@#$%])
肯定前瞻 - 断言下面的正则表达式可以匹配任意数量的任何字符,后跟列表中的单个字符@#$%字面。换句话说,字符串必须包含@#$%。
.{6,20}
匹配任何字符(换行符除外)6至20次。
$
断言字符串末尾的位置
参考:
修改强>
将.
更改为[^__blacklisted_characters_here__]