2010-08-09 20 views
2

我有一個這樣的字符串:使用正則表達式可能會提高字符串解析的性能?

// string1 
horse|cow|goat|zebra| 

和另一個字符串是這樣的:

// string2 
horse:a,pig:b,cow:z,monkey:g,goat:a, 

我的目標是拆分字符串1,然後挑出它的任何出現在字符串2,建立一個直方圖。我目前做這個:

var histogram = {}; 

var animals = string1.split("|"); 
for (var i = 0; i < animals.length; i++) { 
    var animal = animals[i]; 
    var animalColon = animal + ":"; 

    var index = string2.indexOf(animalColon); 
    while (index != -1) { 
     var indexColon = index + animalColon.length; 
     var indexFinal = string2.indexOf(",", indexColon); 
     var letter = string2.substring(indexColon, indexFinal); 

     if (histogram[letter] == null) { 
      histogram[letter] = 1; 
     } 
     else { 
      histogram[letter] = histogram[letter] + 1; 
     } 
     index = string2.indexOf(animalColon, index + 1); 
    } 
} 

末,它可能會打印出類似這樣:

// histogram: 
a: 2 instances // from { horse, goat } 
z: 1 instance // from { cow } 

以上的工作,但我有與DP animals.length通過字符串2檢查大家。

有沒有辦法使用正則表達式來做這個解析 - 本質上並行地運行所有的測試,而不是做多次通過?由於string2是常量,似乎所有的檢查都可以同時完成(不知道是否像這樣實現了正則表達式)。

我增加了字符串1和字符串元素的數量成千上萬元素的順序上,它仍然運行相當快,但很擔心較慢的機器,可維護性和類似的東西,

感謝

回答

0

我會開始預處理你的string2,你說這是不變的。與對象的工作是比保持在字符串中搜索:

var s = "horse:a,pig:b,cow:z,monkey:g,goat:a"; 
var hash = {}; 
var tokens = s.split(','); 
for(var i=0;i<tokens.length;i++){ 
    var a = tokens[i].split(':'); 
    hash[a[0]] = a[1]; 
} 

接下來,當你得到的字符串,你更輕鬆地查找字母(您可能還需要檢查if(letter),如果你得到一個在string1新的動物):

var histogram = {}; 
var string1 = "horse|cow|goat|zebra"; 
var animals = string1.split("|"); 
for(var i=0;i<animals.length;i++){ 
    var letter = hash[animals[i]]; 
    if (!histogram[letter]) 
     histogram[letter] = 0; 
    histogram[letter]++; 
} 

根據你的問題,你很可能濫用的正則表達式來算的字母,但它不是平行的,而是線性的最好,而且很可能足夠複雜不值得的。

0

一些提示,可能會提高性能:

  • 在腳本的開始
  • 計算字符串長度一次定義所有的變量一旦在循環
  • 使用嚴格的比較操作的開始(= ==)適用
0

時根據記錄,你可以使用正則表達式來獲得直方圖3個語句:

var letters = "horse:a,pig:b,cow:z,monkey:g,goat:a"; 
var string1 = "horse|cow|goat|zebra"; 

var h = {}; 
var regex = new RegExp("\\b(?:" + string1 + "):(\\w+)", "ig"); 
letters.replace(regex, function(g0, g1){h[g1] = (h[g1] || 0) + 1;}); 

這有虐待的許多層次,即使用replace作爲一個迭代器(忽略結果,並有回調的副作用),並注意到string1排序的,看起來像一個正則表達式已經與|作爲分隔符,並且它似乎不包含其他正則表達式元字符。

相關問題