我需要创建一个四位数的输入(所有都应该是不同的,第一个应该是1)

时间:2017-01-05 17:56:16

标签: javascript html regex input

我想检查使用" pattern"属性,用户无法输入两个相似的数字,如:1232,1222,1229等。 谷歌搜索后,我发现了这样的内容:pattern="^1(?:([2-9])(?!\1))+$",但它不适用于1232(例如),并且它不会考虑您输入的位数。

2 个答案:

答案 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