我正在对某些标记化字符串进行替换,如下所示:
var myString = "I would like to replace the following token <<start<arg1,arg2 >>> in this string"
OR
var myString = "The expression has an optional <<start<arg1,arg2,arg3 >>> third argument"
在令牌中,我想捕获2到3个字母数字字符串并传递给正则表达式回调函数:
myString.replace(regExExpression, function(m, arg1, arg2, arg3) {
return foo(arg1, arg2, arg3);
});
什么正则表达式将匹配myString的两个版本,捕获arg1,arg2和可选的arg3?
答案 0 :(得分:1)
尝试将每个arg分别放入1 2或3组,see also this regexplanet sample
<<start<
开头,以>>>
(?:,([^,>]*))?
来匹配其他组。 <<start<([^,>]*)(?:,([^,>]*))(?:,([^>]*))?(?=>>>)
答案 1 :(得分:0)
我想你只想要正则表达式
/<<(.*?)>>>/g
如果每行有多个样本,这也应该有效,但如果它们是嵌套的则不行。如果这不能涵盖你的实际问题,那是因为它有点不清楚。
答案 2 :(得分:0)
我跟着处理你的具体案例:
/<<\s*start\s*<\s*(?:([^,>]*))?(?:\s*,\s*([^,>]*))?(?:\s*,\s*([^>]*))?>>>/i
我通常用我的RE撒上\ s *来接受自由格式输入。如果您确定不需要它们,请将它们移除。我不认为您可以编写单个RE来处理任意数量的参数,但是您指定了最多3个。
我的建议是使用以下两阶段解决方案,为您提供任意数量参数的额外灵活性:
.replace (/<<\s*start\s*<\s*(.*)?\s*>>>/i, function (m, args) {
args = args.split (/\s*,\s*/); // array of args
return ('{{[' + args.length + '] : ' + args.join (', ') + '}}');
});
使用如下:
"I would like to replace the following token <<start<arg1,arg2 , arg3>>> in this string".replace (/<<\s*start\s*<\s*(.*)?\s*>>>/i, function (m, args) {
args = args.split (/\s*,\s*/); // arbitrary number of
return ('{{[' + args.length + '] : ' + args.join (', ') + '}}');
});
导致:
"I would like to replace the following token {{[3] : arg1, arg2, arg3}} in this string"