2014-10-07 77 views
3

對於一個非常簡單的JavaScript模板引擎,我需要檢查是否一個給定的字符串「爲」 javascript代碼(如if-elsefor-loopswhile-loops)。因此我使用這個非常簡單的正則表達式/(:|=|{|})/g"tested" here)。而此正則表達式的作品,幾乎任何時候它以某種方式在某些情況下出現故障時,我使用它在一個循環:檢查字符串「是」 javascript代碼與正則表達式

// Very simple regex to check if string "is" javascript code 
var regFunc = /(:|=|{|})+/g; 
// For testing: a simple javascript array 
var testArray = [ 
    // expected: false, is: false 
    'string', 
    // expected: true, is: true 
    'for(var i=0; i<total;i++) {', 
    // expected: true, is: false (??) 
    '}', 
    // expected: true, is: true 
    '}' 
]; 

for(var i = 0; i < testArray.length; i++) { 
    console.log(
    testArray[ i ], 
    regFunc.test(testArray[ i ]) 
); 
} 

您可以檢查JSBin控制檯輸出。所以我想知道爲什麼第一個「{」輸出false和第二個輸出true(這是我對兩者的期望)?

+0

我不明白。 '/ [:= {}] + /'應該如何測試字符串是否是javascript?例如它匹配絕對不是javascript的'::::'。謹慎告訴我們關於實際問題的更多信息? – georg 2014-10-07 14:26:17

+0

@georg這就是爲什麼我在括號中寫入「in」。我知道這個正則表達式不檢查有效的JavaScript。 – Daniel 2014-10-07 14:34:20

回答

3

MDN - Regex - Test

與EXEC(或與之結合),測試多次調用 在同一個全局正則表達式的實例會提前過去 以前的比賽。

這意味着您每次測試字符串時都必須重新初始化您的regexp對象。

+0

我不確定你的意思是「重新初始化」。我試圖刪除全球標誌,它似乎工作正常。 – Daniel 2014-10-07 14:29:26

+0

在每次測試前刪除全局標誌或執行'regFunc = /(:| = | {|})+/g;'。 – blue112 2014-10-07 14:32:13

+0

在每次測試之前使用'reg.lastIndex = 0;'可能也適用。 – Daniel 2014-10-07 14:33:40

相關問題