【问题标题】:Javascript regular expression with a condition [duplicate]带有条件的Javascript正则表达式[重复]
【发布时间】:2012-12-31 08:36:59
【问题描述】:

可能重复:
Password validation regex

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

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

请帮我解决这个问题。我无法确定如何提供满足此要求的条件。

【问题讨论】:

  • 您是否尝试过任何方法并遇到了具体问题?为什么你需要一个正则表达式?
  • 你为什么不一次检查每一个。应该足够简单。
  • 这里经常被问到这个问题,它几乎与Password validation regexPassword strong - not require each condition 重复。这两个答案也表明单个正则表达式并不真正适合这个。
  • 要求“密码至少满足以下三个条件”使得只使用一个正则表达式检查是不可能的。使用 4 个正则表达式和计数器“失败次数”,如果计数器 > 2 则“密码错误”
  • 感谢您的回复。在经历了几个线程之后,我明白了为什么它不能用一个正则表达式来完成。所以我使用了 4 个正则表达式来实现它。

标签: javascript regex


【解决方案1】:

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

可以用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]): 小写英文字母 (a-z) 的前瞻
  • (?=.*[A-Z]): 大写英文字母 (A-Z) 的前瞻
  • (?=.*[^a-zA-Z0-9\x00-\x1f]):预读数字和英文字母以外的某些字符。控制字符也被排除在外。

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

.{8,18} 只匹配任何字符的 8-18。整个正则表达式以^$ 为锚。

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多