Javascript 在正则表达式中匹配内括号表达式
我想在前端解析如下所示的Jinja函数:Javascript 在正则表达式中匹配内括号表达式,javascript,regex,Javascript,Regex,我想在前端解析如下所示的Jinja函数: {{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }} 但我不知道会有多少个参数。那我做了什么?我编写了以下正则表达式: {{\W*some_tag\W*\((['"](.*)['"],\W*){0,}['"](.*)['"]\)}} 但是,当我运行这个正则表达式时,会得到如下输出: matches = regex.exec("{{ some_tag('firstarg', '
{{ 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);
MDN示例使用循环与regexp进行连接 使用参数位于单引号之间且不存在其他单引号的语法的示例:
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\([^()]*)
(或者-如果值可以有(
和)
-with)匹配,然后删除初始和最终的”
s,并用“
+空格”拆分组1+“
对于初学者来说,最里面的括号是一个很好的正则表达式:/\([^()]*)\)/
,内容将是$1
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);