0

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

"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

4 回答 4

4

不要问哪种方法更快;测量它

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

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

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

在此处输入图像描述

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

于 2013-10-23T05:31:16.377 回答
1

无论语言如何,正则表达式都比通过查找给定字符的索引来工作要慢。

在您的情况下,不要使用拆分,而只能使用给定索引处的子字符串。

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

一切都与算法有关……</p>

这是一个更快的实现:

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();
    }
}
于 2013-10-23T06:02:55.983 回答
1

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

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

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

于 2013-10-23T04:37:48.783 回答
0

如果您只想提取索引和值,则不需要解析字符串(这会推断出标记化和处理)。只需找到您想要的位并提取它们。

如果您的字符串总是像 "array[5] = 10" 并且值总是整数,那么:

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

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

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

并处理索引null避免错误的情况。

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

于 2013-10-24T01:25:49.880 回答