我是正则表达式的初学者,在以下条件下创建正则表达式:
- 最少8个字符
- 最多60个字符
- 必须包含2个字母
- 必须包含1个数字
- 必须包含1个特殊字符
- 特殊字符不能为:& `()= [ ]|;“'〈〉
到目前为止,我有以下内容...
(?=^.{8,60}$)(?=.*\d)(?=[a-zA-Z]{2,})(?!.*[&`()=[|;"''\]'<>]).*
但我的最后两次测试都失败了我不知道为什么...
1.!@#$%^*+-_~?,.{}!HR12345
- 123456789AB!
如果您想查看我的测试和预期结果,请访问:https://regexr.com/73m2o
我的测试包含可接受的字符数,适当数量的字母字符,和支持的特殊字符...我不知道为什么它失败了!
3条答案
按热度按时间lf3rwulv1#
使用
.*
来验证字符串中的字符可能效率很低,我建议使用否定字符类来验证字符串。除此之外,问题
Must contain 1 special character
中还有一点在目前的答案中尚未解决。您可以对它使用肯定的lookahead来Assert您认为特殊的字符之一。
说明
^
字符串的开头(在lookahead之外)(?=[^\d\n]*\d)
置位数字(?=[^a-zA-Z\n]*[a-zA-Z][^a-zA-Z\n]*[a-zA-Z])
Assert2个字符a-zA-Z(?=[^!@#$%^\n]*[!@#$%^])
Assert“特殊”字符[^&
()=[|;"'']'<>\n]{8,60}`匹配8-60个字符,不想匹配的字符除外$
字符串结束请参见regex demo。
c9x0cxw02#
问题的一部分是您在
(?=[a-zA-Z]{2,})
中缺少了.*
。但是,您对“两个或更多”字母的实现是不正确的,除非这些字母必须是连续的。你会发现字符串
1234567B89A!
无法匹配,即使做了修正也是如此。我修改的部分是
(?=.*[a-zA-Z].*[a-zA-Z])
,它Assert我们可以匹配一个字母、零个或多个其他字符,然后是另一个字母。https://regex101.com/r/jEsK0S/1
而且,目前没有Assert必须存在特殊字符,只有Assert哪些字符不应该匹配。所以我建议添加另一个带有有效特殊字符列表的lookahead。
jchrr9hc3#
由于2+个字母字符可以出现在字符串的任何位置,因此需要在检查前加上
.*
(就像检查其他字符类一样);否则,在这种情况下,正的lookahead将试图Assert它们出现在字符串的开头(位置0):