regex 我用正则表达式正确地实现了否定的lookaheads吗?

rwqw0loc  于 2022-12-05  发布在  其他
关注(0)|答案(3)|浏览(120)

我是正则表达式的初学者,在以下条件下创建正则表达式:

  • 最少8个字符
  • 最多60个字符
  • 必须包含2个字母
  • 必须包含1个数字
  • 必须包含1个特殊字符
  • 特殊字符不能为:& `()= [ ]|;“'〈〉

到目前为止,我有以下内容...

(?=^.{8,60}$)(?=.*\d)(?=[a-zA-Z]{2,})(?!.*[&`()=[|;"''\]'<>]).*

但我的最后两次测试都失败了我不知道为什么...
1.!@#$%^*+-_~?,.{}!HR12345

  1. 123456789AB!
    如果您想查看我的测试和预期结果,请访问:https://regexr.com/73m2o
    我的测试包含可接受的字符数,适当数量的字母字符,和支持的特殊字符...我不知道为什么它失败了!
lf3rwulv

lf3rwulv1#

使用.*来验证字符串中的字符可能效率很低,我建议使用否定字符类来验证字符串。
除此之外,问题Must contain 1 special character中还有一点在目前的答案中尚未解决。
您可以对它使用肯定的lookahead来Assert您认为特殊的字符之一。

^(?=[^\d\n]*\d)(?=[^a-zA-Z\n]*[a-zA-Z][^a-zA-Z\n]*[a-zA-Z])(?=[^!@#$%^\n]*[!@#$%^])[^&`()=[|;"''\]'<>\n]{8,60}$

说明

  • ^字符串的开头(在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

c9x0cxw0

c9x0cxw02#

问题的一部分是您在(?=[a-zA-Z]{2,})中缺少了.*。但是,您对“两个或更多”字母的实现是不正确的,除非这些字母必须是连续的。
你会发现字符串1234567B89A!无法匹配,即使做了修正也是如此。

(?=^.{8,60}$)(?=.*\d)(?=.*[a-zA-Z].*[a-zA-Z])(?!.*[&`()=[|;"''\]'<>]).*

我修改的部分是(?=.*[a-zA-Z].*[a-zA-Z]),它Assert我们可以匹配一个字母、零个或多个其他字符,然后是另一个字母。
https://regex101.com/r/jEsK0S/1
而且,目前没有Assert必须存在特殊字符,只有Assert哪些字符不应该匹配。所以我建议添加另一个带有有效特殊字符列表的lookahead。

jchrr9hc

jchrr9hc3#

由于2+个字母字符可以出现在字符串的任何位置,因此需要在检查前加上.*(就像检查其他字符类一样);否则,在这种情况下,正的lookahead将试图Assert它们出现在字符串的开头(位置0):

(?=^.{8,60}$)(?=.*\d)(?=.*[a-zA-Z]{2,})(?!.*[&`()=[|;"''\]'<>]).*

相关问题