用于密码验证的正则表达式(正则表达式)

Jo *_*Smo 1 regex passwords password-protection

什么是正确的regex,以满足以下密码标准:

  • 必须包含至少1个小写字母.
  • 必须包含至少1个大写字母.
  • 必须至少包含1个号码.
  • 必须包含至少1个特殊字符(仅允许以下特殊字符:)!#%.
  • 不得包含任何其他字符A-Za-z0-9!#%(;例如,不得包含).
  • 长度必须为8到32个字符.

这是我试过的,但它不起作用:

^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^]).{8,32}
Run Code Online (Sandbox Code Playgroud)

但它应该是:

^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^])[A-Za-z0-9!#%]{8,32}
Run Code Online (Sandbox Code Playgroud)

但Unihedron的解决方案无论如何都更好,只是想为将来会读到这个问题的用户提及这个问题.:)

Unihedron的解决方案(也可以在下面的答案中找到,我为自己复制了它,以防他改变(将其更新为更好的版本),在他的回答中):

^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[!#%])[A-Za-z0-9!#%]{8,32}$
Run Code Online (Sandbox Code Playgroud)

我最终得到了以下内容regex:

^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^])[A-Za-z0-9\!\#\@\$\%\&\/\(\)\=\?\*\-\+\-\_\.\:\;\,\]\[\{\}\^]{8,60}$
Run Code Online (Sandbox Code Playgroud)

再次感谢Unihedron和skamazin.不胜感激!

Uni*_*ron 5

使用这个正则表达式:

/^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=[^!#%]*[!#%])[A-Za-z0-9!#%]{8,32}$/
Run Code Online (Sandbox Code Playgroud)

这是一个正则表达式演示!


阅读更多:

  • @skamazin是的,这是正确的.这种技术可以通过正则表达式引擎的工作方式来解释 - 有两个指针,一个在模式上,另一个在你的String上.指针尽可能多地执行,因此最佳正则表达式是防止回溯的原因(`.*?`对于文字序列有利于`.*`)或适当地"滚动"不必要的内容(参见[this]( http://stackoverflow.com/a/25352148/3622940)一个很好的例子 - `,?[^,]*`是神奇的!). (2认同)