正则表达式..正则表达式..正则表达式..多么痛苦。如何使正则表达式后?

时间:2017-10-10 04:52:35

标签: javascript regex html5 passwords

这是一个指向网站的链接,用于验证和检查正则表达式是否正常工作: https://regex101.com/

这是目前使用的正则表达式:

/(?=[\x21-\x7e]{8,20})(?=[^0-9]*[0-9])(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z]).*/g

下面是正在测试的文本:

"1abcderfggdgf sdvhbsdifsdfsdf1 Ghhuidicbdbuhbdc bhdbcdbebvuheY uuvvvyuv1G 1Guhuuuyuyuby Y%*&^$^%^(^(GVGVYUKVYTUHBKBUFygyygyg

ebfuiuberiueu23423HHII"

我认为这是在做的事情:

  1. 寻找匹配33和126索引之间的任何ascii字符,长度在8-20之间
  2. 寻找一个在数字0或更多次之前的非数字(从我看来,显然这会检测到是否存在数字)
  3. 检查在我的0个或更多非小写字母之前的小写字母。
  4. 用大写字母做同样的事情^^
  5. 使用"。*" 0次或更多次,因为展望未来他们应该缩小它,所以不是每个角色都被允许,它应该与前面的选择相匹配
  6. 这就是我想要的:

    验证遵循这些细节的密码 -

    • 必须至少有1个小写字母
    • 必须至少有1个大写字母
    • 必须至少有一个数字
    • 只能在8到20个字符之间,包括8到20个字符
    • 字符只能包含在ascii中的33到126,不包括空白字符 (我从哪里得到这个? - https://kb.wisc.edu/page.php?id=4073

    额外说明:

    我一直在使用正则表达式末尾的全局(?事物)来指定不要在第一场比赛时停止我认为我的密码字段我不需要这个因为它应该只限于20个字符。(即时通讯)不确定这个)

    检测一个角色是否连续使用了3次以上也很酷,但目前没有必要。

    密码输入到我的php文件中的表单。 我试图将其用作输入标签的验证器。

    目前还没有允许空格的代码。

2 个答案:

答案 0 :(得分:0)

唯一的错误"我看到你试图限制长度而不使用锚点 - 你允许20个字符匹配,但是你不能检查你是否匹配了整个输入。这应该有效:

(?=^[\x21-\x7e]{8,20}$)(?=[^0-9]*[0-9])(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z]).*

工作示例(点击"运行测试"):https://regex101.com/r/L4uia8/3/tests

这是一个风格问题,但我倾向于将.*替换为更重要的预测,因此(这类似于在条件中删除and true):

^(?=[^0-9]*[0-9])(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])[\x21-\x7e]{8,20}$

工作示例:https://regex101.com/r/L4uia8/4/tests

一般情况下,您shouldn't limit the length of passwords

答案 1 :(得分:0)

您可以为每个

使用RegExp
  
      
  • 必须至少有1个小写字母
  •   
  • 必须至少有1个大写字母
  •   
  • 必须至少有一个数字
  •   
[/[a-z]/, /[A-Z]/, /[0-9]/]

创建一个包含匹配字符的字符串

  
      
  • 字符只能包含在ascii中的33到126,不包括空白字符
  •   
[match] = Array.from({length:126 + 1 - 33})
.reduce(([key, prop]) => 
 [key += String.fromCharCode(prop), ++prop], ["", 33]))

检查字符串中的字符是否在有效字符范围内

 && [...str].every(s => match.indexOf(s) > -1)

并检查字符串的.length

&& str.length.length >= 8 
&& str.length < 21;

&#13;
&#13;
const check = (str
              , [match] = Array.from({length:126 + 1 - 33})
                .reduce(([key, prop]) => 
                  [key += String.fromCharCode(prop), ++prop],["", 33])
              , re = [/[a-z]/, /[A-Z]/, /[0-9]/]
              , minLength = 8
              , maxLength = 20 + 1) => 
                  re.every(regex => regex.test(str)) 
                  && [...str].every(s => match.indexOf(s) > -1)
                  && str.length >= minLength
                  && str.length < maxLength;

let [...strings] = ["aB1!!@{@@}}", "Def//3\\21", "gHI//0 \12"];

strings.forEach(str => console.log(check(str)))
&#13;
&#13;
&#13;