2013-10-10 54 views
2

好吧,所以我有多个接收UUID代码的输入。所以我使用jQuery中的.each函数逐个去验证输入是一个UUID代码。所以这是我直到现在代码:每个错误的jQuery正则表达式测试

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()被验证所述第一一个但不是第二个?谢谢。

+0

http://jsfiddle.net/H7v5n/ –

+0

移动正则表达式声明里面的。每个修复它,但我很好奇,为什么这很重要。 http://jsfiddle.net/H7v5n/1/ –

+0

删除g修饰符工作:)谢谢你们! –

回答

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

所以更简单的解决方案是删除'g'修饰符。 – Barmar

+0

的确,尽管我认为OP已经将其用于某个目的。 –

+0

使用'.test()'时,我不确定'g'修饰符有什么用处。 – Barmar

2

拆下正则表达式的g修改。当您使用此修饰符重用regexp时,它会从最后一次匹配的索引开始新测试,而不是新字符串的开始。这个修饰符在使用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-zA-Z在你的性格类时,你还可以使用i修改,使其不区分大小写。

FIDDLE

+0

谢谢Barmar我删除了g修饰符并修复了正则表达式谢谢:) –

+0

Thanks @Barmar。投票 –