在以下字符串中,我想用适当的下拉菜单替换[choice:a3d]。我不确定如何在冒号之后和结束方括号之前格式化选项。
string = "operation [number] [choice:a3d] [number]";
我不确定.replace函数来自哪里,但我正在使用的代码导入了jquery。
string.replace(/(?:\[choice\:)(\w+)(?:\])/g, choice_func);
其中:
function choice_func(choice_lists, listname, default_opt)
{
console.log("choice_lists: "+choice_lists); // [choice:a3d]
console.log("listname: "+listname); // a3d
console.log("default_option: "+default_opt); // 67
var list = choice_lists[listname];
return '<span class="string ' + listname + ' autosocket"><select>' +
list.map(function(item)
{
if (item === default_opt){
return '<option selected>' + item + '</option>';
}else{
return '<option>' + item + '</option>';
}
}).join('') +'</select></span>';
}
不用说代码失败并显示错误“Uncaught TypeError:无法调用未定义的方法'map'
该函数的参数来自何处?
不要认为这些代码是正确的......
答案 0 :(得分:1)
在我看来,只需使用您需要用来计算替换字符串的任何代码然后使用字符串而不是正则表达式函数进行替换会更简单。当您需要检查匹配的上下文以确定替换的内容时,最好使用正则表达式函数,而不是在您只是替换可预先计算的内容时。它可以以这种方式工作 - 不需要那么高的复杂程度。
当使用正则表达式回调时,回调会获得多个参数 - 第一个是匹配字符串,还有许多其他参数记录在here。然后,您必须从该函数返回一个字符串,这是您想要替换它的内容。你的功能是假装它有三个参数,但它不起作用。
我建议您计算替换字符串,然后在没有正则表达式回调函数的情况下对其进行正常的文本替换。
如果您可以更清楚地知道初始字符串是什么以及您想要替换它的内容,我们可以为您提供一些示例代码。正如您在问题中所显示的那样,您的字符串声明甚至不接近合法的javascript,并且我不清楚您想要在该字符串中替换的内容。
伪代码如下所示:
var menuStr = "xxxxxxx";
var replaceStr = choice_func(lists, name, options);
menuStr = menuStr.replace(/regular expression/, replaceStr);