2010-09-08 91 views
2

爲了把這個上下文中,可以考慮這兩個函數:如何限制字符串到JavaScript中的特定字符集?

ml_RestrictToChars = function(input,regex) { 
    var result = '';var c = ''; 
    var rx = new RegExp(regex); 
    for (var i = 0; i < input.length; i++) { 
     c = input.charAt(i); 
     if (rx.test(c)) { 
      result += c; 
     } 
    } 
    return result; 
}; 
ml_OmitChars = function(input,regex) { 
    var rx = new RegExp(regex,'g'); 
    return input.replace(rx,''); 
}; 

第一功能將限制輸入到一組特定的字符,第二個將省略從輸入任何字符或字符序列。正如你可以在第一個函數中看到的代碼所看到的那樣,它只會在單個字符類被傳入'regex'參數時才起作用,因爲包含代碼一次只檢查一個字符。

考慮輸入字符串12-34,現在如果我通過的'[0-9]'正則表達式到所述第一功能和'[^0-9]'到第二功能,我會得到相同的輸出按預期:1234

然而,如果使用在第二個函數中的更高級表達式,例如'[^0-9][^0-9]-',我將獲得12-的輸出。但是,如果我將多個字符類傳遞給第一個函數,它將返回一個空字符串。

我想知道的是,如果有一種簡單的方法(最好是沒有循環)做ml_OmitChars的反轉,所以它們的工作方式相似嗎?

+0

爲什麼在ml_RestrictToChars函數中測試每個字符? – Johan 2010-09-08 19:54:30

+0

如果它沒有使用這種方法測試每個字符,那麼將無法排除這些字符。這就是if(rx.test(c))行所做的 - 確定每個字符是否應該包含在結果中。我並不是說這是解決這個問題的唯一方法,我希望有人能夠從不同的角度來解決這個問題。 – NightOwl888 2010-09-08 21:52:54

+0

啊,那麼你可以使用你的omitchars函數,並返回原始和omitchars函數之間的差異。這將反映你的功能。 – Johan 2010-09-09 06:07:27

回答

1

匹配每個字符很簡單(但速度很慢),並且顯示它的工作原理。你現在想要的是匹配一個模式並連接所有的匹配。這樣做是這樣的:

ml_RestrictToChars = function(input,regex) { 
    var rx = new RegExp (regex, 'g'); 
    var matches = input.match (rx); 
    return matches.join (''); 
}; 

第一行使它成爲「全球性」的正則表達式,從而改變比賽的行爲()。第二行返回數組中的所有匹配項,最後一行將它們連接成單個字符串並返回。

+0

感謝您花時間完成這項工作。我認爲這會做到這一點。 – NightOwl888 2012-12-03 14:17:47

相關問題