繁体   English   中英

Javascript Regex用于捕获弯曲括号中的变量

[英]Javascript Regex for capturing variables in curved brackets

我有一个字符串被送入JavaScript函数,我需要从中提取变量。

var str = "heres:a:func('var1', 'var2', 'var3', 2)"

我越来越近,但想用一个正则表达式来做。

str.match(/\((.*)\)/)[1].split(/\s*,\s*/)

结果应如下所示:

['var1', 'var2', 'var3', 2]

这应该('\\w+'|\\d+)它在单引号或( | )数字未引用值之间捕获单词( \\w =字母数字和连字符)。

请在此处查看演示

对于代码示例:

var str = "heres:a:func('var1', 'var2', 'var3', 2)"
var reg=new RegExp("('\\w+'|\\d+)", "g");
var i= 0;
var arr = [];
str.replace(reg,function(m,group) {arr[i++]=group})

console.log(arr)给出:

["'var1'", "'var2'", "'var3'", "2"]

这是一种方法:

Regex101链接

顺便说一下,这不包括引号,如果需要,可以选择添加引号。

var pattern = /(\w+)(?!.*\()(?=.*\))/g;
var str = "heres:a:func('var1', 'var2', 'var3', 2)";
var matches = str.match(pattern);
console.log(matches); //['var1','var2','var3','2']

这基本上搜索单词字符组,然后做出消极和积极的前瞻。
基本上

(?!.*\() 

说我希望这不是在任意数量的字符加上(字符和字符)之前

(?=.*\)) 

说我想要在任意数量的角色和a)角色之前。

然后捕获组在开头,所以如果你想保留引号(我认为你不对,你可以用([\\'\\ w] +)替换(\\ w +)


编辑:要在字符串中包含空格,您可以执行以下操作:

var pattern = /([\w]+\s[\w]+|\w+)(?!.*\()(?=.*\))/g

但是这不会捕获尾随的空白区域,只是由2个字类型(a-Z0-1)包围的空间。 此外,只允许单词中有1个空格,所以如果你需要倍数,你也必须检查它。 您可以修改它以检查2个有效单词字符之间的任意数量的单词字符或空格。

对于多个空间:

var pattern = /([\w]+[\s\w]*[\w]+|\w+)(?!.*\()(?=.*\))/g

包括1个空格: Regex101链接

包括多个空格: Regex101链接

EDIT2:
就像最后一个,如果你真的想要在整个过程中添加一堆空格,你可以这样做:

包括多个空格,多次: Regex101链接

/([\w]+[\s\w]+[\w]+|\w+)(?!.*\()(?=.*\))/g

您可以使用一行,但仍然有2个正则表达式:1)删除所有直到开头(和结束) ,然后在带有可选空格的逗号上拆分。 这样,我们会得到所有的var S,不管有多少变数。

 var str = "heres:a:func('var1', 'var2', 'var3', 2)"; alert(str.replace(/.*\\(|\\s*\\)\\s*$/g, '').split(/\\s*,\\s*/)); 

此外,您可能会尝试一种奇特的正则表达式,但它并不安全(只有在数据格式正确的情况下才有效):

 var re = /('[^']*?'|\\b\\d+\\b),?(?=(?:(?:[^']*'){2})*[^']*\\)$)/g; var str = 'heres:a:func23(\\'var1\\', \\'var2\\', \\'var3\\', 2, \\'2345\\')'; while ((m = re.exec(str)) !== null) { document.getElementById("res").innerHTML += m[1] + "<br/>"; } 
 <div id="res"/> 

由于我无法添加评论,我发布了答案。

 var str = "heres:a:func('var1', 'var2', 'var3', 2)" var args = /\\(\\s*([^)]+?)\\s*\\)/.exec(str); if (args[1]) { args = args[1].split(/\\s*,\\s*/); console.log(args); alert(args); } 

或者在这里试试: https//jsfiddle.net/oz3Ljfe1/3/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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