如何在密码复杂性正则表达式前瞻中包含等号?

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
  1. 为什么附加的等号字符不正确地匹配 Abcd0123 明明没有特殊字符?
  2. 有没有办法将等号字符作为特殊符号包含在内?

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}$/