Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 有没有办法在正则表达式的帮助下确保一个字符串至少包含N个数字、M个大写字母、R个特殊字符?_Regex - Fatal编程技术网

Regex 有没有办法在正则表达式的帮助下确保一个字符串至少包含N个数字、M个大写字母、R个特殊字符?

Regex 有没有办法在正则表达式的帮助下确保一个字符串至少包含N个数字、M个大写字母、R个特殊字符?,regex,Regex,此外,字符串长度必须大于8个字符,小于30个字符。 例如,需要确保字符串(密码)至少有2位数字、3个大写字母和4个特殊字符(如#$%^等)一个正则表达式可以只使用正lookaheads: (?=(.*\d.*){2,})(?=(.*[A-Z].*){3,})(?=(.*[^a-zA-Z\d\s].*){4,})(?=.{8,30}) 解释 这个正则表达式使用多个正向lookahead(前面的(?=)-部分)来检查光标位置后面是否跟有lookahead中表达式的状态。每一个前瞻都涵盖了你的一个条

此外,字符串长度必须大于8个字符,小于30个字符。
例如,需要确保字符串(密码)至少有2位数字、3个大写字母和4个特殊字符(如#$%^等)

一个正则表达式可以只使用正lookaheads:

(?=(.*\d.*){2,})(?=(.*[A-Z].*){3,})(?=(.*[^a-zA-Z\d\s].*){4,})(?=.{8,30})
解释 这个正则表达式使用多个正向lookahead(前面的
(?=)
-部分)来检查光标位置后面是否跟有lookahead中表达式的状态。每一个前瞻都涵盖了你的一个条件

  • (?=(.*\d.*){2,})
    随机位置的两个或多个数字
  • (?=(.[A-Z].*){3,})
    三个或更多随机位置的大写字母
  • (?=(.[^a-zA-Z\d\s].*{4,})
    四个或更多“特殊”字符(具有特殊含义,无字母、无数字、无空格)
  • (?=.{8,30})
    8到30个字符
  • 看到这个了吗

    缺点 我想有更好的方法来解决这个问题。有趣的是,除了空字符串(
    '
    )之外,整个正则表达式无法生成匹配项,因为它只覆盖光标位置后面的内容。所以基本上是这样的:字符串中有没有任何位置后跟一个文本部分,它填充了所有这些条件。但它实际上并不搜索匹配项。前瞻cource中的捕获组生成自己的匹配,但第一个组最多只能是一个空字符串

    var text=“!1#A$20亿?C”;
    var regex=/(?=(.*\d.*){2,})(?=(.*[A-Z].{3,})(?=(.*[^A-zA-Z\d\s].*){4,})(?=.{8,30})/;
    var res=正则表达式测试(文本);
    var matches=text.match(正则表达式)
    警报(res?“匹配”:“不匹配”);
    警报(matches.length>0?“有匹配项”:“没有匹配项”);
    对于(var i=0;i}
    你可以通过大量使用正面表情来做到这一点,但我想这不是最好的方法it@nozzleman我已经试了几个小时了,但是失败了。“为什么这是一种不好的方式?”nozzleman,请解释一下。