【发布时间】:2014-10-14 05:31:25
【问题描述】:
什么是正确的regex,以满足以下密码标准:
- 必须包含至少 1 个小写字母。
- 必须至少包含 1 个大写字母。
- 必须至少包含 1 个数字。
- 必须至少包含 1 个特殊字符(仅允许使用以下特殊字符:
!#%)。 - 不得包含除
A-Za-z0-9!#%之外的任何其他字符(例如,不得包含;)。 - 长度必须为 8 到 32 个字符。
这是我尝试过的,但它不起作用:
^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^]).{8,32}
但应该是:
^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^])[A-Za-z0-9!#%]{8,32}
但无论如何,Unihedron 的解决方案更好,只是想为将来会阅读此问题的用户提及这一点。 :)
Unihedron 的解决方案(也可以在下面的他的答案中找到,我自己复制了它,以防他在他的答案中更改(将其更新为更好的版本)):
^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[!#%])[A-Za-z0-9!#%]{8,32}$
我最终得到了以下regex:
^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^])[A-Za-z0-9\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^]{8,60}$
再次感谢 Unihedron 和 skamazin。赞赏!
【问题讨论】:
-
也分享你的努力。
-
如果它只有 32 个字符长...为什么不直接遍历字符串 5 次...在这种情况下仍然是 O(1)
-
顺便说一句,您不必担心帖子更改,您可以随时view revisions of posts编辑。
-
关于 PHP 的 IDK,但你可以做类似的事情。 ToLower() 然后与原始字符串比较, ToUpper() 和比较。将 (0-9) 替换为 '' 并比较等。由于长度很短,您根本不必担心运行时间。与正则表达式相比,IMO 提高了可读性。不知道它是否更快
-
@Steve 可读代码? Nonono, don't ever...
标签: regex passwords password-protection