我有一个看起来像这样的字符串:
{{tagName(21, 'hello, jane','smith')}}
我正在尝试使用正则表达式match()
此字符串导致:
[0] = tagName
[1] = 21
[2] = 'hello, jane'
[3] = 'smith'
字符串的参数部分可以增长。也就是说,它可能有更多或更少的参数,正则表达式需要“贪婪”,但却知道如何对它们进行分组。
我一直在尝试这样的事情:^\{\{([^\(]+)\({1}(.*)\){1}\}\}
但结果是:
[0] = tagName
[1] = 21, 'hello, jane','smith'
我应该怎么做我的正则表达式以获得我想要的结果?
答案 0 :(得分:4)
将{
,}
,(
,)
替换为空字符串;匹配[a-z]+
,\d+
,'.+'
后跟,
或输入结束
var str = "{{tagName(21, 'hello, jane','smith')}}";
var res = str.replace(/\{|\}|\(|\)/g, "")
.match(/([a-z]+)|\d+|('.+')(?=,)|('.+')(?=$)/ig);
console.log(res);
答案 1 :(得分:0)
如果你可以使用两个正则表达式,你可以返回一个带有函数名的新数组,并将所有参数连接到该数组上。
使用ES6,您可以使用spread operator:
const str = "{{tagName(21, 'hello, jane','smith')}}";
const result = str.match(/^\{\{([^\(]+)\({1}(.*)\){1}\}\}/);
console.log([
result[1],
...result[2].match(/^\d+|'.*?'/g)
])

在ES5中,您必须concat将包含函数名称的数组作为其第一项的参数:
var str = "{{tagName(21, 'hello, jane','smith')}}";
var result = str.match(/^\{\{([^\(]+)\({1}(.*)\){1}\}\}/);
console.log([result[1]].concat(result[2].match(/^\d+|'.*?'/g)))

实际上,您可以在ES6中concat
,但
答案 2 :(得分:0)