假设我有以下格式的字符串数组:
"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();
}
}
有更优雅的方法来解析这样的东西吗?如果答案是使用正则表达式,它会使代码变慢吗?
答案 0 :(得分:4)
不要问哪种方法更快; measure it!
这是一个正则表达式,应该与您在代码中实现的内容相匹配:
/array\[(\d+)]\s*=\s*(.+)/
为了帮助您学习正则表达式,您可以使用Regexper之类的工具来可视化代码。以下是上述表达式的可视化:
注意索引我假设它应该是一个整数,但是对于该值,任何字符都被接受。您的代码没有指定索引或值应该是数字,但我做了一些假设。我将它作为练习留给读者,以便在需要时将表达式调整为更合适的东西。
答案 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
以避免错误的情况。
如果您真的想要解析字符串,还有一些工作要做。