我想解析前端的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'"
但这不是我想要的。我需要一种匹配内括号的方法,以便我只有与firstarg
,secondarg
,thirdarg
和fourtharg
对应的变量。
我如何得到这个?
答案 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组与'
+空格分开? + '
。