javascript中的正则表达式,检测可选参数

时间:2013-05-15 00:02:17

标签: javascript regex

我正在对某些标记化字符串进行替换,如下所示:

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?

3 个答案:

答案 0 :(得分:1)

描述

尝试将每个arg分别放入1 2或3组,see also this regexplanet sample

  • 每个属性组均以<<start<开头,以>>>
  • 结尾
  • 将在打开和关闭标记之间匹配2到3组以逗号分隔的子字符串,可以通过在第二组和第三组之间插入(?:,([^,>]*))?来匹配其他组。
  • 令牌3是可选的

<<start<([^,>]*)(?:,([^,>]*))(?:,([^>]*))?(?=>>>)

enter image description here

答案 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"