JS中数字的正则表达式

Regular Expression in JS for numbers

本文关键字:正则表达式 数字 JS      更新时间:2023-09-26

我正在寻找javascript中的一个正则表达式来处理这个问题:

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

从这个开始,然后我失去了

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

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

function validateNumber() {
  var numbers = document.getElementById('numbers1').value;
  if (numbers && !isNaN(numbers)) {
    // make sure a that something was entered and that it is a number
    if (numbers.length < 6 || numbers.length > 15) {
      // make sure number is between 6 and 15 digits
      alert('Number must be between 6 and 15 digits long.');
    } else if (numbers.match(/(.+)'1+/)) {
      // make sure that the numbers contain no repeated digits
      alert('Number cannot be repeated.');
    } else {
      alert('Number validated!');
      // otherwise, the number is validated
    }
  } else {
    // if no number was entered
    alert('Please enter a number.');
  }
}
<input type="text" placeholder="enter numbers" id="numbers1" />
<input type="button" value="Validate!" onclick="validateNumber()" />

  1. 您的第一条规则是正确的:

    ^'d{6,15}$
    

    这既包括 6-15 的长度要求,也涵盖了它必须是数字的事实。

  2. 使用下一个规则,测试重复的子字符串比测试它们是否不存在更容易:

    (.+)'1
    
  3. 最后一个要复杂得多。下面介绍了如何测试至少 3 个不同的字符:

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

    ^(?='d{6,15}$)(?!.*(.+)'1)(.+)(?!'2)(.+)(?!'2|'3).+$
    

这回答了你的书面问题,但正如我在评论中所说,你应该非常仔细地考虑你是否从正确的假设开始。您不必为此使用正则表达式,也不必在一个正则表达式中完成所有操作。当您在 6 个月后回来并且必须更改规则时,上述模式是否易于使用?

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

这是我的尝试,只是为了挑战:

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

演示

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

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

但是,仅

以传统方式进行操作(没有正则表达式(可能会更易于维护。