Javascript 使用正则表达式来潜在地提高字符串解析的性能?

Javascript 使用正则表达式来潜在地提高字符串解析的性能?,javascript,Javascript,我有这样一个字符串: // string1 horse|cow|goat|zebra| // string2 horse:a,pig:b,cow:z,monkey:g,goat:a, 另一个字符串如下: // string1 horse|cow|goat|zebra| // string2 horse:a,pig:b,cow:z,monkey:g,goat:a, 我的目标是分割string1,然后挑出string2中出现的任何情况,以构建直方图。我目前正在这样做: var histogr

我有这样一个字符串:

// string1
horse|cow|goat|zebra|
// string2
horse:a,pig:b,cow:z,monkey:g,goat:a,
另一个字符串如下:

// string1
horse|cow|goat|zebra|
// string2
horse:a,pig:b,cow:z,monkey:g,goat:a,
我的目标是分割string1,然后挑出string2中出现的任何情况,以构建直方图。我目前正在这样做:

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);
    }
}
上面的方法可以工作,但我必须对动物进行dp。长度通过string2来检查每个人

有没有一种方法可以使用正则表达式来进行这种解析——实际上是并行运行所有测试,而不是进行多次传递?因为string2是常量,所以似乎所有的检查都可以同时进行,不确定正则表达式是否是这样实现的

我在string1和string2中增加了数千个元素的数量,它仍然运行得很快,但我担心机器速度较慢、可维护性等问题


谢谢

我首先要预处理你的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];
}

根据您的问题,您可能会滥用正则表达式来计算字母数,但它不是并行的,最多是线性的,并且可能不够复杂,不值得使用。

我首先要预处理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];
}

根据您的问题,您可能会滥用正则表达式来计算字母数,但它不是并行的,最多是线性的,可能不够复杂,不值得使用。

一些可能提高性能的技巧:

在脚本开头定义一次所有变量 在循环开始时计算一次字符串长度 使用严格比较运算符===如果适用
一些可能提高性能的提示:

在脚本开头定义一次所有变量 在循环开始时计算一次字符串长度 使用严格比较运算符===如果适用
对于记录,您可以使用正则表达式在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看起来已经像一个正则表达式了,以|作为分隔符,并且它似乎不包含其他正则表达式元字符。

对于记录,您可以使用正则表达式在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看起来已经像一个正则表达式了,以|作为分隔符,并且它似乎不包含其他正则表达式元字符