我想编写一个函数,例如:
function extract(template, example){
//some magic
return obj;
}
给出如下输入:
var template = "/some/path/{param_one}/{another_param}/etc?arg1={value}";
var example = "/some/path/foo/bar/etc?arg1=baz";
将返回此对象:
{param_one: "foo", another_param: "bar", value: "baz"}
我无法控制模板或示例(例如,我无法将模板更改为具有命名捕获组的正则表达式)。我可以放心地假设给定的示例将与模板匹配。
首先,我能够通过以下方式提取 key :
var re = /\{(.+?)\}/g;
var match;
do {
match = re.exec(template)
if (match) {
console.log(match[1]);
}
} while (match);
最佳答案
我使用正则表达式和替换来解决:
function extract(template, example){
//some magic
var re = /(?:([^\{]*)\{([^\}]*)\})/g;
var result = example;
var params = [];
var match, values, obj = {};
do {
match = re.exec(template)
if (match) {
result = result.replace(match[1], '|');
params.push(match[2]);
}
} while (match);
values = result.split('|');
for(var i=0;i < params.length; i++) {
obj[params[i]] = values[i+1];
}
return obj;
}
首先,它使用正则表达式获取参数部分和文本部分,然后用 |
替换所有文本部分并将 key 存储到参数数组中。
最后,它循环遍历从上面分割的参数数组和匹配值
希望这有帮助
关于javascript - 从给定简单模板的示例字符串中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44170972/