Javascript 密码的正则表达式

Javascript 密码的正则表达式,javascript,regex,Javascript,Regex,我正试图让正则表达式的最低要求的密码是至少6个字符;1个大写字母、1个小写字母和1个数字。看起来很容易?我在regex没有任何“展望未来”的经验,因此我只想: if(!pwStr.match(/[A-Z]+/) || !pwStr.match(/[a-z]+/) || !pwStr.match(/[0-9]+/) || pwStr.length < 6) //was not successful if(!pwStr.match(/[A-Z]+/)| |!pwStr.mat

我正试图让正则表达式的最低要求的密码是至少6个字符;1个大写字母、1个小写字母和1个数字。看起来很容易?我在regex没有任何“展望未来”的经验,因此我只想:

if(!pwStr.match(/[A-Z]+/) || !pwStr.match(/[a-z]+/) || !pwStr.match(/[0-9]+/) ||
    pwStr.length < 6)
    //was not successful
if(!pwStr.match(/[A-Z]+/)| |!pwStr.match(/[A-Z]+/)| |!pwStr.match(/[0-9]+/)||
pwStr.长度<6)
//没有成功
但我想将其优化为一个正则表达式,并在此过程中提升我的正则表达式技能

^.*(?=.{6,})(?=.*[a-zA-Z])(?=.*\d)(?=.*[!&$%&? "]).*$
  • ^.*
    正则表达式的开始
  • (?=.{6,})
    密码长度将至少包含6个字符
  • (?=.[a-zA-Z])
    密码将至少包含1个大写字母和1个小写字母
  • (?=.*\d)
    密码将至少包含1个数字
  • (?=.[!$%&?”) 密码将至少包含给定的特殊字符
  • .*$
    正则表达式结束

这是一个你可以查看这个正则表达式的网站-

我的经验是,如果你能把正则表达式分离出来,代码读起来就越好。你可以把正则表达式和正面的lookaheads结合起来(我看到这是刚刚做的),但是…为什么

编辑:


好的,好的,如果您有一些配置文件,您可以在其中传递字符串以编译成正则表达式(我已经看到了,以前也做过)我想这是值得的。但除此之外,即使提供的答案被更正以符合您的需要,我仍然建议您不要这样做,除非您打算创建这样的东西。单独的正则表达式处理起来更好。

我还没有彻底测试过,但这里有一个更有效的Amit版本。我认为他也允许使用un在混合中指定字符(从技术上讲,这并不是一个规则)。如果你意外地将一大块文本作为目标,这一个不会对你发狂,它会在太长的字符串上更快失败,并且只允许最后一个类中的字符

“.”应该少用。想想它必须做的循环来确定与它所能表示的所有字符的匹配。使用求反类更有效

`^(?=[^0-9]{0,9}[0-9])(?=[^a-z]{0,9}[a-z])(?=[^A-Z]{0,9}[A-Z])(?=[^@#$%]{0,9}[@#$%])[0-9a-zA-Z@#$%]{6,10`}$
试图找到理想的正则表达式并没有什么错,但在需要的时候把它分开

RegEx tends to be explained poorly. I'll add a breakdown:

a - a single 'a' character
ab - a single 'a' character followed by a single b character
a* - 0 or more 'a' characters
a+ - one or more 'a' characters
a+b - one or any number of a characters followed by a single b character.
a{6,} - at least 6 'a' characters (would match more)
a{6,10} - 6-10 'a' characters
a{10} - exactly 10 'a' characters iirc - not very useful

^ - beginning of a string - so ^a+ would not math 'baaaa'
$ - end of a string - b$ would not find a match 'aaaba'

[] signifies a character class. You can put a variety of characters inside it and every character will be checked. By itself only whatever string character you happen to be on is matched against. It can be modified by + and * as above.

[ab]+c - one or any number of a or b characters followed by a single c character
[a-zA-Z0-9] - any letter, any number - there are a bunch of \<some key> characters representing sets like \d for 'digits' I'm guessing. \w iirc is basically [a-zA-Z_]

note: '\' is the escape key for character classes. [a\-z] for 'a' or '-' or 'z' rather than anything from a to z which is what [a-z] means

[^<stuff>] a character class with the caret in front means everything but the characters or <stuff> listed - this is critical to performance in regEx matches hitting large strings.

. - wildcard character representing most characters (exceptions are a handful of really old-school whitespace characters). Not a big deal in very small sets of characters but avoid using it.

(?=<regex stuff>) - a lookahead. Doesn't move the parser further down the string if it matches. If a lookahead fails, the whole match fails. If it succeeds, you go back to the same character before it. That's why we can string a bunch together to search if there's at least one of a given character.

So:

^ - at the beginning followed by whatever is next

(?=[^0-9]{0,9}[0-9]) - look for a digit from 0-9 preceded by up to 9 or 0 instances of anything that isn't 0-9 - next lookahead starts at the same place

etc. on the lookaheads

[0-9a-zA-Z@#$%]{6,10} - 6-10 of any letter, number, or @#$% characters
RegEx的解释往往很糟糕。我将添加一个细分:
a-单个“a”字符
ab-单个“a”字符后跟单个b字符
a*-0个或多个“a”字符
a+-一个或多个“a”字符
a+b-一个或任意数量的a字符后跟一个b字符。
a{6,}-至少6个“a”字符(将匹配更多)
a{6,10}-6-10'a'字符
一个{10}-正好是10个'a'字符iirc-不是很有用
^-字符串的开头-因此^a+不会计算“baaaa”
$-字符串结尾-b$找不到匹配的“aaaba”
[]表示一个字符类。您可以在其中放入各种字符,并且每个字符都将被检查。只有您碰巧使用的字符串才与之匹配。它可以通过+和*进行修改,如上所述。
[ab]+c-一个或任意数量的a或b字符后跟一个c字符
[a-zA-Z0-9]-任何字母,任何数字-有一堆字符表示集合,如我猜的“数字”的\d。\w iirc基本上是[a-zA-Z_]
注意:“\”是字符类的转义键。[a \-z]表示“a”或“-”或“z”,而不是[a-z]表示的从a到z的任何内容
[^]前面带插入符号的字符类意味着除字符或列出的字符以外的所有字符-这对于命中大字符串的正则表达式匹配的性能至关重要。
-表示大多数字符的通配符(例外是少数真正老式的空白字符)。对于非常小的字符集来说,这没什么大不了的,但要避免使用它。
(?=)-先行。如果匹配,则不会将解析器进一步向下移动。如果先行失败,则整个匹配失败。如果成功,则返回到它之前的同一个字符。这就是为什么我们可以将一组字符串串在一起,以搜索给定字符中是否至少有一个。
因此:
^-开始时,然后是下一步
(?=[^0-9]{0,9}[0-9])-查找0-9之间的数字,前面最多有9或0个非0-9的实例-下一个前瞻从同一位置开始
等等,看起来
[0-9a-zA-Z@#$%]{6,10}-6-10任何字母、数字或@#$%字符

不需要“$”,因为我已将所有内容限制为10个字符

假设密码可以由任何字符组成,最小长度至少为6个字符,并且必须包含至少一个大写字母、一个小写字母和一个十进制数字,我建议使用以下方法:(使用python语法的注释版本)

re\u pwd\u valid=re.compile(“”)
#用一个上限、下限和数字验证密码6字符分钟。
^#锚定至管柱起点。
(?=[^A-Z]*[A-Z])#至少声明一个大写字母。
(?=[^a-z]*[a-z])#至少声明一个小写字母。
(?=[^0-9]*[0-9])#至少声明一个十进制数字。
.{6,}#将密码与至少6个字符匹配
$#锚定到字符串末端。
“”,re.VERBOSE)
下面是JavaScript:

re_pwd_valid = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]).{6,}$/;
附加:如果需要多个所需字符,请查看

编辑:将懒惰的点星号更改为贪婪的字符类。感谢Erik Reppen-很好的优化!

“优化”“?每个用户运行一次或两次的正则表达式?过早的优化是万恶之源-作为程序员要学习的最重要的事情之一是,使代码更复杂会给任何必须维护它的人带来成本。试试这个-;希望它有帮助。函数checkPwd(str){if(str.length<6){return(“太短”;}else if(str.length>50){return(“太长”)}else if(str.search(/\d/)=-1){return(“no_num”);}else if(str.search(/[a-zA-Z]/)=-1){return return(“no_字母”)}else if(str se