我有一个来自数据库的计算字符串,如:
var calc = "{a}+{b}==2"
我希望用" {}"拉出所有元素。这样我就可以从数据库中查找它们的值。什么是最快这样做的方式,所以我最终找到了一个可以查找的有序数组,并将字符串中的值替换回来。
我考虑过:
- For loop, looking for { then finding the next }
- Split with a map
- IndexOf
答案 0 :(得分:1)
使用正则表达式
var exp = /{([^}]+)}/g ,index;
while(index = exp.exec("{a}+{b}==2")) {
console.log(index[1]);
}
。 Demo
答案 1 :(得分:1)
不确定它是否是“最快”的方式,但你应该考虑使用正则表达式。
类似的东西:
var calc = "{a}+{b}==2";
var re = /{([^}]+)}/g;
var res;
var result = [];
while (res = re.exec(calc))
{
result.push(res[1]);
}
console.log(result);
您的正则表达式可能需要根据{}表达式的实际定义进行细化(基于允许的字符,引用等)。
收到值后,您可以使用replace
替换值。
var values = {a: 1, b: 3};
var replaced = calc.replace(re,function(match,name) { return values[name]; });
console.log(replaced);
注意:如果您打算将此信息发送给eval
等,请非常小心。
答案 2 :(得分:0)
Regex首先浮现在脑海中,但在O(n)时间内实现这项工作的另一种方式可能是;
function getDatas(s){
var dataOn = false;
return Array.prototype.reduce.call(s,(d,c) => dataOn ? c !== "}" ? (d[d.length-1] += c,d)
: (dataOn = false, d)
: c === "{" ? (dataOn = true, d.push(""),d)
: d, []);
}
var calc = "{a}+{b}+{colorSpace}==2",
result = getDatas(calc);
console.log(result);

出于好奇,我已经对JSBen进行了一些测试,似乎@ jcaron的正则表达确实非常有效。您可以使用indexOf
或for
循环等其他任何想法扩展这些测试。