0

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

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?

4

3 回答 3

1

描述

试试这个,这会将每个 arg 分别放入组 1 2 或 3 中,另请参阅这个 regexplanet 示例

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

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

在此处输入图像描述

于 2013-05-15T03:27:40.467 回答
0

我想你只想要正则表达式

/<<(.*?)>>>/g

如果每行有多个样本,这也应该有效,但如果它们是嵌套的,则无效。如果这不能涵盖您的实际问题,那是因为它有点不清楚。

于 2013-05-15T00:11:59.487 回答
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"
于 2013-05-15T03:51:17.657 回答