基于正则表达式匹配调用javascript函数

基于正则表达式匹配调用javascript函数,javascript,jquery,regex,Javascript,Jquery,Regex,在下面的字符串中,我想用适当的下拉菜单替换[choice:a3d]。我不确定在冒号之后和右大括号之前,选项需要如何格式化 string = "operation [number] [choice:a3d] [number]"; 我不确定.replace函数来自何处,但我正在使用的代码已经导入了jquery string.replace(/(?:\[choice\:)(\w+)(?:\])/g, choice_func); 其中: function choice_func(choice_lis

在下面的字符串中,我想用适当的下拉菜单替换[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>';  
}
function choice\u func(选项列表、列表名、默认选项)
{  
log(“选项列表:”+选项列表);/[choice:a3d]
log(“listname:+listname);//a3d
log(“default_option:+default_opt);//67
var list=choice_lists[listname];
返回“”+
列表.映射(功能(项)
{  
如果(项目===默认选项){
返回“”+项目+“”;
}否则{
返回“”+项目+“”;
}
}).连接(“”)+“”;
}
不用说代码失败了,错误为“UncaughtTypeError:无法调用未定义的方法'map'”

函数的参数从何而来


不要假设这些代码中的任何一个都是正确的……

在我看来,您只需使用需要使用的代码来计算替换字符串,然后使用字符串而不是regex函数进行替换就可以了。当您需要检查匹配的上下文以确定替换内容时,最好使用正则表达式函数,而不是在您只是对可以事先计算的内容进行替换时。它可以这样工作——只是不需要那么复杂

当使用regex回调时,回调会得到多个参数——第一个参数是匹配字符串,还有许多其他参数被记录在案。然后,您必须从该函数返回一个字符串,该字符串就是您要替换它的字符串。你的函数假装它有三个参数,但它没有,因此它不会工作

我建议您计算替换字符串,然后在没有regex回调函数的情况下对其进行普通文本替换

如果您能更清楚地了解初始字符串是什么以及要在其中替换什么,我们可以给您一些示例代码。正如您在问题中所展示的,您的字符串声明甚至与合法的javascript不太接近,我也不清楚您到底想在该字符串中替换什么

伪代码如下所示:

var menuStr = "xxxxxxx";
var replaceStr = choice_func(lists, name, options);
menuStr = menuStr.replace(/regular expression/, replaceStr);

这个问题有点让人困惑,你认为你能用你想要实现的东西创建一个jsbin示例吗?这有帮助吗?我建议您不要这样编写代码。记住我的建议,当你3年后回到这个代码。