Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在正则表达式中匹配内括号表达式_Javascript_Regex - Fatal编程技术网

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

Javascript 在正则表达式中匹配内括号表达式,javascript,regex,Javascript,Regex,我想在前端解析如下所示的Jinja函数: {{ some_tag('firstarg', 'secondarg', 'thirdarg', 'fourtharg') }} 但我不知道会有多少个参数。那我做了什么?我编写了以下正则表达式: {{\W*some_tag\W*\((['"](.*)['"],\W*){0,}['"](.*)['"]\)}} 但是,当我运行这个正则表达式时,会得到如下输出: matches = regex.exec("{{ some_tag('firstarg', '

我想在前端解析如下所示的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);

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