如何通过逗号用regex将参数化作为字符串分隔?

时间:2016-08-31 02:35:02

标签: javascript regex

我有一个看起来像这样的字符串:

{{tagName(21, 'hello, jane','smith')}}

我正在尝试使用正则表达式match()此字符串导致:

[0] = tagName
[1] = 21
[2] = 'hello, jane'
[3] = 'smith'

字符串的参数部分可以增长。也就是说,它可能有更多或更少的参数,正则表达式需要“贪婪”,但却知道如何对它们进行分组。

我一直在尝试这样的事情:^\{\{([^\(]+)\({1}(.*)\){1}\}\}

但结果是:

[0] = tagName
[1] = 21, 'hello, jane','smith'

我应该怎么做我的正则表达式以获得我想要的结果?

3 个答案:

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

到目前为止,我已经设法提出以下内容:

([A-Za-z]+)|('.*?'|[^',\s\(]+)(?=\s*,|\s*\))

https://regex101.com

上进行测试