\A(?=\S*?[A-Z])(?=\S*?[a-z])(?=\S*?[0-9])\S{6,}\z
(这来自正则表达式的JGSoft风格)。
基本上,这个正则表达式的目标是:“密码复杂性 测试输入是否包含6个或更多字符。 输入必须包含至少一个大写字母,一个小写字母和一个数字。“
因此,有三个组可以按任何顺序放置(第一个大写字母,然后是非大写字母,然后是数字)。 \ A匹配字符串的开头,\ z匹配字符串的结尾。我有点困惑(?=部分。它应该是一个积极的前瞻。我不知道这个正则表达式如何允许你以任何顺序键入密码字符。
答案 0 :(得分:4)
看起来你得到了基本的想法。想想这样:
前瞻不是捕获 - 你停留在同一个位置(在这种情况下是开始),并检查你是否匹配此前进 - 这就是订单无关紧要的原因
以下是输入1@34Ab
的示例。
\A
- 匹配字符串的开头。大。(?=\S*?[A-Z])
- \S*?[A-Z]
可以匹配1@34A
,(?=)
断言成功。(?=\S*?[a-z])
- 可以匹配1@34Ab
。(?=\S*?[0-9])
- 可以匹配1
。\S{6,}
- 匹配1 @ 34Ab,一直到最后(\z
)。答案 1 :(得分:1)
Lookahead意味着我测试是否有模式而不改变位置,所以
它从头开始测试 字符串有零个或多个没有 白色空间后跟大写 后者。
然后再次检查 如果有的话,字符串的开头 零个或多个没有空格 其次是小写后者。
然后再次检查 如果有的话,字符串的开头 零个或多个没有空格 然后是数字。
最后检查字符串是否为6 或者更多没有空白字符。
前3个测试(大写,小写,数字)预测 - 检查是从字符串的开头而不改变位置,只有最后一个测试(6个或更多字符)改变位置。 lookahead是它的名字,只是看看,看看没有移动的东西,所以从字符串的开头执行前3个测试,所以只要所有3个都是正面的顺序并不重要