在正则表达式中匹配内部括号表达式

时间:2016-03-04 21:26:26

标签: javascript regex

我想解析前端的Jinja函数:

{{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }}

但我不知道会有多少参数。那我该怎么办?我写了以下正则表达式:

{{\W*some_tag\W*\((['"](.*)['"],\W*){0,}['"](.*)['"]\)}}

然而,当我运行这个正则表达式时,我输出如下:

matches = regex.exec("{{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }}")

matches:
  "{{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg')}}",
  "'firstarg', 'secondarg', 'thirdarg'",
  "'firstarg', 'secondarg', 'thirdarg'",
  "'fourtharg'"

但这不是我想要的。我需要一种匹配内括号的方法,以便我只有与firstargsecondargthirdargfourtharg对应的变量。

我如何得到这个?

3 个答案:

答案 0 :(得分:0)

使用单个正则表达式在Javascript中无法做到这一点。因此,在没有第一个和最后一个引号的情况下提取最里面的括号,然后使用', '拆分第一个捕获组。

var s = "{{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }}";
var re = /{{\s*(\w+)\s*\(\s*['"]((?:[^'"]*['"]\s*,\s*["'])*[^"']*)['"]\s*\)\s*}}/g;
var results = [];

while(m = re.exec(s)) {
    results.push({'func':m[1], 'param':m[2].split(/['"]\s*,\s*['"]/)})
}

console.log(results);

答案 1 :(得分:0)

MDN示例使用带有正则表达式的find successive matches循环。

使用参数在单引号之间而不存在其他单引号的语法的示例:

var re = /[^']*'([^']*)'/g  // remember single quoted match

var str = "{{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }}"

var args = []; // args array
var match;     // match array
while(match = re.exec(str))
{   args.push(match[1]);
}

args;  // [firstarg,secondarg,thirdarg,fourtharg]

答案 2 :(得分:0)

如果您需要确保在some_tag之后获得这些参数,则可以在replace方法中利用回调方法:

var s = "{{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }}";
var res = [];
s.replace(/some_tag\(([^()]*)\)/, function(m, g1) {
    var splt = g1.replace(/^'([\s\S]*)'$/, '$1').split(/',\s*'/).map(function (t) { res.push(t); });
})
document.body.innerHTML = JSON.stringify(res, 0, 4);

您将整个some_tag(...)some_tag\(([^()]*)\)匹配(或者 - 如果值可以包含() - 与some_tag\(([\s\S]*)\)\s*}}),则删除初始和最终'并将第1组与' +空格分开? + '