.Query错误中的jQuery正则表达式测试

时间:2013-10-10 14:54:44

标签: javascript jquery regex

好的,所以我有多个输入接收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 - true

1 - 00000000-0000-0000-0000-000000000000 - false

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

2 个答案:

答案 0 :(得分: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;
}

Example fiddle

第二次迭代失败的原因:

  

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

文章:Be careful when reusing regex objects

答案 1 :(得分:2)

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

    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放在角色类中。

FIDDLE