-4

可能重复:
密码验证正则表达式

我需要使用以下策略在 javascript 中进行密码验证。你能告诉我这个的正则表达式吗?我对正则表达式很陌生。

  • 密码长度应为 8 到 18 个字符,并且密码应至少满足以下条件中的 3 项:
  • 密码应至少包含一个小写字符 (az)
  • 密码应至少包含一个大写字符 (az)
  • 密码应至少有一个数值(0-9)
  • 密码应该有一个特殊字符(即@ . - _ # $ %)

这个你能帮我吗。我无法确定如何提供满足此要求的条件。

4

1 回答 1

2

这个答案只是为了表明在一个正则表达式中执行它是多么不可读。请考虑其他更简洁的替代方案来编写您的代码。

它可以在 1 个正则表达式中完成,但这很可怕:

^(?:(?=.*[a-z])(?=.*\d)(?=.*[^a-zA-Z0-9\x00-\x1f])|(?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[A-Z])(?=.*\d)(?=.*[^a-zA-Z0-9\x00-\x1f])|(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9\x00-\x1f])).{8,18}$

它可以缩短一点,但仍然丑陋:

^(?:(?=.*\d)(?=.*[^a-zA-Z0-9\x00-\x1f])(?:(?=.*[a-z])|(?=.*[A-Z]))|(?=.*[a-z])(?=.*[A-Z])(?:(?=.*\d)|(?=.*[^a-zA-Z0-9\x00-\x1f]))).{8,18}$

您在问题中提到了4个额外条件,它们对应于这些片段:

  • (?=.*\d): 预读数字 (0-9)
  • (?=.*[a-z]): 小写英文字母 (az) 的前瞻
  • (?=.*[A-Z]): 大写英文字母 (AZ) 的前瞻
  • (?=.*[^a-zA-Z0-9\x00-\x1f]): 预读数字和英文字母以外的某些字符。控制字符也被排除在外。

据我所知,正则表达式中没有机制可以说匹配 4 个条件中的 3 个。所以我必须列举所有这些条件,这些条件占据了正则表达式的大部分。

.{8,18}只需匹配任何字符的 8-18。整个正则表达式都用^and锚定$

于 2012-12-31T10:08:11.437 回答