2015-09-22 48 views
0

我正在研究Google表格自定義函數,該函數可以通過響應值之一來過濾調查響應。我的意圖是,我可以根據受訪者參加的活動對答案進行分類。循環正則表達式測試的意外結果

這裏的邏輯是接受一組值和一個事件字符串。該字符串確定使用哪個正則表達式,並且這些值是正在過濾的內容。

此刻,即使每個值都匹配,每隔一個測試都會返回false。我已經放置了幾條調試線,以便更容易地查看步驟,並且正如預期的那樣,每個其他測試都是失敗的。

實際上,這個函數會將過濾值作爲新數組返回(返回「values」而不是「debug」)。

function filterValuesByEvent(_values, _event) { 

    var count = 0; 
    var debug = []; 
    var di = 0; 
    var values = []; 
    var event_regexp; 

    var events = getValuesFromRangeName("event"); 
    var responses = getCountOfResponses(events); 

    // takes in the hard string and converts the relevant string[] to a regexp 
    // regexp searches globally and ignores case 
    if(_event == "EVENT") { 
    event_regexp = new RegExp(event.join("|"), 'gi'); 

    } else { 
    return ""; 
    } 


    for (var i = 0; i < responses; i++) { 

    var re = _values[i]; 
    var e_re = events[i]; 

    debug[di] = "Checking " + e_re + " against " + event_regexp; 
    di++; 

    if(event_regexp.test(e_re)) { 
     debug[di] = "Match found"; 
     di++; 

     values[count] = re; 
     count = count + 1; 

    } else { 
     debug[di] = "No match"; 
     di++; 

    } 
    } 

    return debug; 
} 

調試輸出:

檢查事件對/事件|活動|展示|樂隊/ GI

找到匹配

檢查事件對/事件|活動|展示|帶/ GI

不匹配

檢查事件對/事件|活動|表演|樂隊/ GI

找到匹配

檢查事件對/事件|活動|展示|樂隊/ GI

不匹配

檢查事件對/事件|活動|展示|帶/ GI

匹配發現

回答

0

卸下的 'GI'=>event_regexp = new RegExp(event.join("|"), 'i');

'G'

完整的答案>here<

簡短的回答: 當您使用test正則表達式牢記過去的指數最後一次測試,並用它爲下。

這可以在像一些情況下有用的:

var string = 'test, test, test, test'; var regexp = /test/g; 

while(regexp.test(string)){ 
    console.log(regexp.lastIndex); 
} 
+0

這工作 - 但爲什麼呢?我把那些人認爲他們是修飾語,呼籲全球搜索忽略案件。 –

+0

瘋狂,很高興知道。我也注意到,我可以離開'我',一切正常,只是'g'導致的問題,這與您提供的鏈接一致。 –

+0

是的'我'國旗將正常工作,但在這種情況下測試'EVENT'&'事件'很奇怪:P。 –