Regex 正则表达式不';不能将下划线识别为特殊字符

Regex 正则表达式不';不能将下划线识别为特殊字符,regex,Regex,我正在尝试创建一个用于密码验证的正则表达式,以便密码必须至少为8个字符,并且包括一个大写、一个小写、一个数字和一个特殊字符。它可以正常工作,只是它无法识别下划线(389;)为特殊字符。即,Pa$$w0rd匹配,但Pass_w0rd不匹配。想法?这部分正则表达式似乎在寻找特殊字符: /(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*\W+)(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/ 请注意,字符类不包含下划线,请尝试将其更改

我正在尝试创建一个用于密码验证的正则表达式,以便密码必须至少为8个字符,并且包括一个大写、一个小写、一个数字和一个特殊字符。它可以正常工作,只是它无法识别下划线(389;)为特殊字符。即,Pa$$w0rd匹配,但Pass_w0rd不匹配。想法?

这部分正则表达式似乎在寻找特殊字符:

/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*\W+)(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/
请注意,字符类不包含下划线,请尝试将其更改为以下内容:

(?=.*[!@#$%^&*-])
您还需要修改或删除正则表达式的这一部分:

(?=.*[_!@#$%^&*-])
\W
相当于
[^a-zA-Z0-9\
,因此,如果下划线是您唯一的特殊字符,则正则表达式的这一部分将导致其失败。相反,请将其更改为以下内容(或将其删除,这是多余的,因为您之前已经检查了特殊字符):

完整正则表达式:

(?=.*[^\w_])

问题是,根据定义,唯一可能满足
\W
的东西不是
[a-zA-Z0-9.]
。下划线与
\W
不匹配,在
Pass\w0rd
中,它也不匹配任何其他内容


我怀疑既有你的特殊字符列表,又有
\W
是过火了。选择一个,你可能会更快乐。我还建议将整个过程分成几个单独的测试,以获得更好的可维护性。

一个更简单的正则表达式适用于您:

/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*[^\w_])(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/
原始正则表达式中几乎没有错误,例如:

  • 您不需要使用lookahead来确保输入中有8个字符
  • 负前瞻
    [。\n]
    丢失
    *
  • (?=.*\W+)
    是多余的,可能没有任何用途

    • 这里的这个也可以。它通过排除字母数字字符和空白来定义特殊字符,因此它包括下划线:

      /(?=.*[_!@#$%^&*-])(?=.*\d)(?!.*[.\n])(?=.*[a-z])(?=.*[A-Z])^.{8,}$/
      

      答案其实很简单。您的特殊字符中没有包含
      。这是一些看起来非常邪恶的正则表达式。你确定要用正则表达式来处理类似的事情吗?随着需求的变化,它可能变得很难维护。David B,实际上,因为这个正则表达式使用了前瞻性断言,所以它的可维护性可能很好。每个部分都是模块化的,不依赖于任何其他部分。我已经想知道正则表达式如何确保一个字符串包含所有的几组字符并具有最小长度+1.回答问题和解释,因为这是一个我还没有想到的非常酷的方法。:-)哎呀,忘了在我的代码片段中包含那个修订版了。它仍然不接受Pass_w0rd:(谢谢!不过我在正则表达式方面真的很糟糕,你知道我如何解决它吗?我已经添加了一个可能的解决方案。这似乎对所有角色都很有效。但不会占用空间
      /(?=.*[_!@#$%^&*-])(?=.*\d)(?!.*[.\n])(?=.*[a-z])(?=.*[A-Z])^.{8,}$/
      
      (?=.*?[A-Z])(?=.*?[a-z])(?=.*?[\d])(?=.*?[^\sa-zA-Z0-9]).{8,}