匹配正则表达式中的内括号表达式

Matching inner parentheses expressions in regex

本文关键字:表达式 正则表达式      更新时间:2023-09-26

我想在前端解析 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的变量。

我怎么得到这个?

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 拆分为 ' + 空格? + '

在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);