Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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/regex/17.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
Javascript JS中数字的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript JS中数字的正则表达式

Javascript JS中数字的正则表达式,javascript,regex,Javascript,Regex,我正在寻找一个javascript正则表达式来处理以下问题: 只接受6到15位之间的数字,6是最小值。 数字不能包含重复的数字组,例如408408或123123 数字不能只包含两个不同的数字,例如121212 我从这个开始,然后我就迷失了 ^[0-9]{6,15}$ 以下是我的尝试,只是为了迎接挑战: ^(?!\d*?(\d+?)\1)\d{6,15}$ (?!\d*?(\d+?)\1)部分将通过匹配一组数字并在之后立即尝试匹配相同的数字来确保没有重复的数字组。如果找到一个,则匹配失败

我正在寻找一个javascript正则表达式来处理以下问题:

只接受6到15位之间的数字,6是最小值。 数字不能包含重复的数字组,例如408408或123123 数字不能只包含两个不同的数字,例如121212

我从这个开始,然后我就迷失了

^[0-9]{6,15}$ 

以下是我的尝试,只是为了迎接挑战:

^(?!\d*?(\d+?)\1)\d{6,15}$

  • (?!\d*?(\d+?)\1)
    部分将通过匹配一组数字并在之后立即尝试匹配相同的数字来确保没有重复的数字组。如果找到一个,则匹配失败

  • 如果要允许两个相同的连续数字,请将
    (?!\d*(\d+?)\1)
    替换为
    (?!\d*(\d{2,}?)\1)(?!(\d)\2*(\d)(?:\2|\3)*$)
    。然后,通过匹配一系列的一个数字,然后是一个不同的数字,然后是两个数字的组合,从而确保有两个以上的不同数字。如果到达字符串的末尾,则会强制匹配失败


但是,如果不使用正则表达式,只使用传统的方法,可能会更易于维护。

使用if语句和正则表达式的组合,而不仅仅是正则表达式

函数validateEnumber(){
var numbers=document.getElementById('numbers1').value;
if(数字&&!isNaN(数字)){
//确保输入了某个内容,并且该内容是一个数字
如果(numbers.length<6 | | numbers.length>15){
//确保数字在6到15位之间
警报('数字长度必须在6到15位之间');
}else if(number.match(/(.+)\1+/)){
//确保数字不包含重复的数字
警报('编号不能重复');
}否则{
警报('已验证的编号!');
//否则,将验证该编号
}
}否则{
//如果没有输入号码
警报('请输入一个数字');
}
}

  • 第一条规则是正确的:

    ^\d{6,15}$
    
    这既包括6-15长度的要求,也包括必须是数字的事实

  • 根据下一条规则,测试重复的子字符串比测试是否缺少子字符串更容易:

    (.+)\1
    
  • 最后一个要复杂得多。以下是测试至少3个不同字符的方法:

    (.+)(?!\1)(.+)(?!\1|\2).
    
  • 把它们放在一起,你会得到什么:

    ^(?=\d{6,15}$)(?!.*(.+)\1)(.+)(?!\2)(.+)(?!\2|\3).+$
    
  • <>这是书面回答你的问题,但是正如我在评论中所说的,你应该非常仔细地考虑你是否从正确的假设开始“强”。< /强>你不必使用正则表达式,也不必在一个正则表达式中完成。当你在6个月后回来,不得不改变规则时,上述模式对你来说容易吗


    更重要的是,如果您试图确保用户选择强密码,您使用的规则将减少可能的选择数量,从而削弱您的安全性。最大长度为15个字符表示您正在以纯文本形式存储密码。你应该对它们进行哈希运算

    需要更多的例子。为什么是正则表达式?为什么不是简单循环?是的,也可以,但我认为正则表达式更好。
    数字不能包含重复的数字组,例如408408
    ,我很确定这在正则表达式中是不可能的。我有一个可能可行的想法,但使用简单的过程代码可能会更简单。它也是模糊的;3914475会因为4重复而计数吗?这是密码策略吗?如果是这样,我强烈敦促你取消这一规定。禁止重复数字将大大减少允许的密码数量,使密码更容易猜测。这实际上会降低密码的安全性。谢谢大家的回答。我将回顾这些验证,看看在这种情况下更好地实现什么。请接受最适合您的答案。感谢Justin的所有支持comments@rgx71-很高兴我能帮忙。你最后做了什么?看起来我们独立得出了几乎相同的答案。a+1。事实上,等等……我很好奇你为什么要编辑你的模式,有什么我遗漏的吗?看起来这一个没有强制执行“至少3个不同的数字”规则,但原来的规则强制执行了。@JustinMorgan我意识到如果不重复组,实际上不能有少于3个不同的数字;)这就是为什么替代解决方案会更改规则,使组至少为2位数字。(也享受你的+1)