[英]Matching inner parentheses expressions in 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'"
但这不是我想要的。 我需要一种匹配内部括号的方法,以便我只具有对应于firstarg
, secondarg
, thirdarg
和fourtharg
。
我怎么得到这个?
用单个正则表达式无法在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);
使用参数位于单引号之间且不存在其他单引号的语法的示例:
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]
如果需要确保在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组? + '
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.