解析有或没有正则表达式?哪一个更快?

时间:2013-10-23 04:29:14

标签: javascript regex

假设我有以下格式的字符串数组:

"array[5] = 10"

在JavaScript中解析它的最佳解决方案是什么?

惭愧地不熟悉正则表达式,我只能提出这样的事情:

for (i in lines){

var index = lines[i].indexOf("array[");

    if (index >= 0) {
        var pair = str.substring(index + 6).trim().split('=');
        var index = pair[0].trim().substring(0, pair[0].trim().length - 1);
        var value = pair[1].trim();
    }
}

有更优雅的方法来解析这样的东西吗?如果答案是使用正则表达式,它会使代码变慢吗?

4 个答案:

答案 0 :(得分:4)

不要问哪种方法更快; measure it

这是一个正则表达式,应该与您在代码中实现的内容相匹配:

/array\[(\d+)]\s*=\s*(.+)/

为了帮助您学习正则表达式,您可以使用Regexper之类的工具来可视化代码。以下是上述表达式的可视化:

enter image description here

注意索引我假设它应该是一个整数,但是对于该值,任何字符都被接受。您的代码没有指定索引或值应该是数字,但我做了一些假设。我将它作为练习留给读者,以便在需要时将表达式调整为更合适的东西。

答案 1 :(得分:1)

如果你想要一个正则表达式方法,那么类似的东西就可以做到这一点:^".*?\[(\d+)\]\s*=\s*(\d+)"$。这将匹配并提取方括号(\[(\d+)\])中的数字以及"符号前面末尾的任何数字。

匹配后,它会将它们放入一个您最终可以访问的组中。请查看this之前的SO帖子,了解如何访问所述群组。

我无法评论速度,但通常正则表达式使字符串处理代码更紧凑,缺点是代码通常更难以阅读(取决于表达式的复杂性)。

答案 2 :(得分:1)

正如找到给定char的索引一样,正则表达式比正常工作要慢。

在您的情况下,不要在给定索引处使用split但只使用substring。

此外,一些改进性能的提示:pair[0].trim()被调用两次,而第一次trim没有用,因为你已经调用了pair[1].trim()

所有关于算法......

这是一个更快的实现:

for (var i = 0; i < lines.length; i++) {
    var i1 = lines[i].indexOf("[");
    var i2 = lines[i].indexOf("]");
    var i3 = lines[i].indexOf("=");


    if (i1 >= 0) {
        var index = lines[i].substring(i1, i2);
        var value = lines[i].substring(i3, lines[i].length-1).trim();
    }
}

答案 3 :(得分:0)

如果你想要做的就是提取索引和值,你就不需要解析字符串(这可以推断出标记和处理)。只需找到你想要的位并提取它们。

如果你的字符串总是像#34; array [5] = 10&#34;并且值总是整数,然后:

var nums = s.match(/\d+/);
var index = nums[0];
var value = nums[1];

应该做的伎俩。如果有可能没有匹配,那么您可能需要:

var index = nums && nums[0];
var value = nums && nums[1];

并处理 index value null以避免错误的情况。

如果您真的想要解析字符串,还有一些工作要做。