如何在密码复杂性正则表达式前瞻中包含等号?
How to include equal sign in password complexity regex lookahead?
我从字面上复制粘贴了 https://github.com/heartcombo/devise/wiki/How-To:-Set-up-simple-password-complexity-requirements 中的示例密码复杂性正则表达式。
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/
我修改了它以包含等号:
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-\=]).{8,70}$/
或
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-=]).{8,70}$/
但是,在通过irb查看时,遇到了以下情况:
irb(main):001:0> 'Abcd0123' =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/
=> nil
irb(main):002:0> 'Abcd0123' =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-\=]).{8,70}$/
=> 0
irb(main):003:0> 'Abcd0123' =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-=]).{8,70}$/
=> 0
- 为什么附加的等号字符不正确地匹配
Abcd0123
明明没有特殊字符?
- 有没有办法将等号字符作为特殊符号包含在内?
n.b.
Mac OS X 10.14.6
checked with the following ruby versions:
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin18] - irb 0.9.6(09/06/30)
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin18] - irb 1.2.1 (2019-12-24)
简答:[*-=]
表示“*
到=
范围内的字符”,实际表示以下任一字符:
*+,./0123456789:;<=
要解决此问题,请将 -
符号放在组的 start 处,或者将 end组,或使用反斜杠:
# Good:
[#?!@$%^&*=-]
[-#?!@$%^&*=]
[#?!@$%^&*\-=]
# Bad:
[#?!@$%^&*-=]
更好的回答:在我看来,这不是一个好的软件设计!为什么要将密码限制为包含这些有限的任意“特殊字符”之一?为什么我不能使用 £
作为“特殊字符”?还是<
?还是€
?还是±
?还是~
? .........
您可以改用命名组,将 所有 非字母数字字符作为“特殊”字符包含在内:
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=[[:^alnum:]]).{8,70}$/
我从字面上复制粘贴了 https://github.com/heartcombo/devise/wiki/How-To:-Set-up-simple-password-complexity-requirements 中的示例密码复杂性正则表达式。
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/
我修改了它以包含等号:
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-\=]).{8,70}$/
或
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-=]).{8,70}$/
但是,在通过irb查看时,遇到了以下情况:
irb(main):001:0> 'Abcd0123' =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/
=> nil
irb(main):002:0> 'Abcd0123' =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-\=]).{8,70}$/
=> 0
irb(main):003:0> 'Abcd0123' =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-=]).{8,70}$/
=> 0
- 为什么附加的等号字符不正确地匹配
Abcd0123
明明没有特殊字符? - 有没有办法将等号字符作为特殊符号包含在内?
n.b.
Mac OS X 10.14.6
checked with the following ruby versions:
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin18] - irb 0.9.6(09/06/30)
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin18] - irb 1.2.1 (2019-12-24)
简答:[*-=]
表示“*
到=
范围内的字符”,实际表示以下任一字符:
*+,./0123456789:;<=
要解决此问题,请将 -
符号放在组的 start 处,或者将 end组,或使用反斜杠:
# Good:
[#?!@$%^&*=-]
[-#?!@$%^&*=]
[#?!@$%^&*\-=]
# Bad:
[#?!@$%^&*-=]
更好的回答:在我看来,这不是一个好的软件设计!为什么要将密码限制为包含这些有限的任意“特殊字符”之一?为什么我不能使用 £
作为“特殊字符”?还是<
?还是€
?还是±
?还是~
? .........
您可以改用命名组,将 所有 非字母数字字符作为“特殊”字符包含在内:
password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=[[:^alnum:]]).{8,70}$/