我想检查使用" pattern"属性,用户无法输入两个相似的数字,如:1232,1222,1229等。
谷歌搜索后,我发现了这样的内容:pattern="^1(?:([2-9])(?!\1))+$"
,但它不适用于1232(例如),并且它不会考虑您输入的位数。
答案 0 :(得分:1)
您可以使用以下内容:
^(?!.*(\d).*\1)1\d{3}$
它的工作原理是要求1个,然后再多3个数字。它使用负向前瞻来验证数字在4个数字中的任何位置都不会重复。
运行以下示例以获取测试用例:
let regex = /^(?!.*(\d).*\1)1\d{3}$/;
function test(numberAsString) {
console.log(numberAsString, regex.test(numberAsString));
}
test('1232'); // false, number repeated
test('1222'); // false, number repeated
test('1229'); // false, number repeated
test('1234'); // true
test('2345'); // false, 1 does not start
test('1789'); // true
test('12345'); // false, too many digits
test('123'); // false, too little digits

正则表达式的解释:
1\d{3}
是表示需要1,然后再需要3个数字的部分
(?!.*(\d).*\1)
是negative lookahead(请注意(?!
)。它扫描整个输入(.*
),直到找到捕获的数字(\d
)(由()
包围),并扫描其余字符串({{1}) }),寻找自己的副本(.*
)或换句话说,第一次捕获是什么。简单来说,这里是一个1的例子,任何时候都不能跟1:\1
。但由于您对任何数字((?!.*1.*1)
)使用特殊字符,因此您可以断言找到的任何数字都不会重复。
\d
断言字符串的开头
^
断言字符串的结尾。需要这些开始和结束断言,以便像$
这样的字符串不会通过验证。
答案 1 :(得分:0)
检查出来
// Magical function.
var checkDigits = function(num, maxLength) {
let allDigits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
try {
if (num.length < 1 || num.length > maxLength) throw new Error("You need to enter exactly " + maxLength + " digits");
for (let i = 0; i < num.length; i++) {
if (allDigits[num[i]] === null) throw new Error("You repeated a digit in your sequence");
allDigits[num[i]] = null;
}
} catch (e) {
console.error(e);
return false
}
return allDigits;
};
// Getting data from dom.
var num = document.getElementById("num").value;
// Trying to see the data in the console.
if (num[0] == 1) console.log(checkDigits(num.slice(1)));
嗯,我只能说,我希望你能理解
编辑:哎呀我错过了一部分抱歉。干杯, RJ