2013-10-10 23 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。投票 –