2

好的,所以我有多个接收 UUID 代码的输入。因此,我使用 jQuery 中的 .each 函数一一验证输入是否为 UUID 代码。所以这是我到目前为止的代码:

function validateAll(){
    var regex = /^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}$/ig;
    $('input.offer').each(function(x){
        if($(this).val() !== ""){
            console.log(x+" - "+$(this).val()+" - "+regex.test($(this).val()));
        }
    });
    return true;
}

现在,当我使用两个输入运行它时: 00000000-0000-0000-0000-000000000000 这就是我在控制台中得到的:

0 - 00000000-0000-0000-0000-000000000000 - 真

1 - 00000000-0000-0000-0000-000000000000 - 假

为什么 regex.test() 验证第一个而不是第二个?谢谢。

4

2 回答 2

4

您需要将正则表达式实例化带入循环 - 它不能针对另一个字符串重新测试。

function validateAll(){
    $('input.offer').each(function(x) {
        var regex = /^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}$/ig;
        if($(this).val() !== ""){
            console.log(x + " - " + $(this).val() + " - " + regex.test($(this).val()));
        }
    });
    return true;
}

示例小提琴

第二次迭代失败的原因:

当 [the regex] 是一个全局正则表达式时。它将尝试从任何先前字符串中最后一个匹配项的索引进行匹配。

文章:重用正则表达式对象时要小心

于 2013-10-10T15:03:48.127 回答
2

从正则表达式中删除g修饰符。当您使用此修饰符重用正则表达式时,它将从最后一个匹配项的索引开始新测试,而不是从新字符串的开头。这个修饰符在使用时没有任何作用Regex::test,因为它只告诉你正则表达式是否匹配任何地方——多个匹配是多余的。所以应该是:

    var regex = /^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}$/i;

另外,我想知道为什么当您还使用修饰符使其不区分大小写时,您将两者a-z都放在字符类中。A-Zi

小提琴

于 2013-10-10T15:14:32.000 回答