2010-08-09 67 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排序的,看起来像一个正则表达式已经与|作为分隔符,并且它似乎不包含其他正则表达式元字符。