我正在寻找javascript中的正则表达式来处理这个问题:
仅接受6到15位数之间的数字,最小值为6。 数字不能包含重复数字组,例如408408或123123 数字不能只包含两个不同的数字,例如121212
我从这开始,然后我就失去了
^[0-9]{6,15}$
答案 0 :(得分:2)
而不仅仅是正则表达式,使用if语句和RegEx的组合。
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 :(得分:1)
这是我的尝试,仅针对挑战:
^(?!\d*?(\d+?)\1)\d{6,15}$
(?!\d*?(\d+?)\1)
部分将通过匹配一组数字并尝试在之后立即匹配相同的数字来确保没有重复数字组。如果找到一个,则匹配失败。
如果您想允许两个相同的连续数字,请将(?!\d*?(\d+?)\1)
替换为(?!\d*?(\d{2,}?)\1)(?!(\d)\2*(\d)(?:\2|\3)*$)
。然后,通过匹配一个数字的一系列,然后是不同的数字,后跟一系列两个数字的组合,确保有超过2个不同的数字。如果它到达字符串的末尾,则强制匹配失败。
但是,如果不使用正则表达式,以传统方式进行操作可能会更加可维护。
答案 2 :(得分:1)
您的第一条规则是正确的:
^\d{6,15}$
这涵盖了6-15长度要求以及它必须是数字的事实。
根据下一条规则,测试重复的子串比测试它们的缺席更容易:
(.+)\1
最后一个要复杂得多。以下是测试至少3个不同字符的方法:
(.+)(?!\1)(.+)(?!\1|\2).
把它们放在一起,你得到了什么:
^(?=\d{6,15}$)(?!.*(.+)\1)(.+)(?!\2)(.+)(?!\2|\3).+$
回答你的问题,但正如我在评论中所说,你应该仔细考虑你是否从正确的假设开始。你不必使用正则表达式,也不必在一个正则表达式中完成所有操作。当您在6个月内回来并且必须更改规则时,上述模式是否易于您使用?
更重要的是,如果您尝试确保用户选择一个强密码,那么您使用的规则将通过减少可能的选择数量来弱化您的安全性。最多15个字符的长度表明您以纯文本格式存储密码。你应该哈希他们。