繁体   English   中英

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

[英]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'"

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

我怎么得到这个?

用单个正则表达式无法在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示例使用循环查找带有正则表达式的连续匹配项

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM