用于捕获曲线括号中变量的Javascript正则表达式

用于捕获曲线括号中变量的Javascript正则表达式,javascript,regex,Javascript,Regex,我有一个字符串被输入到JavaScript函数中,我需要从中提取变量 var str = "heres:a:func('var1', 'var2', 'var3', 2)" 我快到了,但我想用一个正则表达式 str.match(/\((.*)\)/)[1].split(/\s*,\s*/) 结果应如下所示: ['var1', 'var2', 'var3', 2] var pattern = /([\w]+\s[\w]+|\w+)(?!.*\()(?=.*\))/g 您可以用一行来完成,但

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

var str = "heres:a:func('var1', 'var2', 'var3', 2)"
我快到了,但我想用一个正则表达式

str.match(/\((.*)\)/)[1].split(/\s*,\s*/)
结果应如下所示:

['var1', 'var2', 'var3', 2]
var pattern = /([\w]+\s[\w]+|\w+)(?!.*\()(?=.*\))/g

您可以用一行来完成,但仍然有两个regexp:1)删除开头的所有
和结尾的
,然后在逗号上用可选的空格分隔。这样我们就可以得到所有的
var
s,不管变量有多少

var str=“heres:a:func('var1','var2','var3',2)”;

警报(str.replace(/.*\(|\s*\)\s*$/g',).split(/\s*,\s*/)因为我不能添加评论,所以我发布了一个答案。 var str=“heres:a:func('var1','var2','var3',2)” 变量args=/\(\s*([^)]+?)\s*\)/.exec(str); if(args[1]){ args=args[1]。拆分(/\s*,\s*/); console.log(args); 警报(args); }
这应该可以在单引号或(
)数字无引号值之间捕获单词(
\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)提供:


这里有一种方法:

顺便说一句,这不包括引号,您可以根据需要添加引号

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+)(我认为您是不对的)


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

['var1', 'var2', 'var3', 2]
var pattern = /([\w]+\s[\w]+|\w+)(?!.*\()(?=.*\))/g
但这不会捕获尾随空格,只会捕获由两种单词类型(a-Z0-1)包围的空格。此外,这将只允许字中有1个空格,因此如果您需要倍数,您也必须检查它。您可以对其进行修改,以检查任意数量的单词字符或两个有效单词字符之间的空格

对于多个空间:

var pattern = /([\w]+[\s\w]*[\w]+|\w+)(?!.*\()(?=.*\))/g
包括1个空格:

包括多个空间:

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

包括多个空格,多次:


只用两个有什么问题?你有时间检查我的方法吗?实际上,我怀疑单一的正则表达式解决方案在JavaScript中是否可行。它的正则表达式引擎的功能非常差:(@Tensibai:如果有空格或加号或减号怎么办?你的正则表达式将不匹配特殊字符、Unicode字母等。只需在类的左侧添加允许的字符,如[\w_@$欧元%+~&]+而不是仅\w+,它就可以了。如果你真的想允许除单个引号外的所有引号(var的结尾)使用负类[^']+要匹配除单引号外的任何内容,您不能确定自己是否在一个开始和结束括号内,因为在JS中没有\G运算符。是的,但阻塞部分是缺少lookback,而不是\G。无论如何,如果您确实想确保括号,可以通过在函数回调中使用两个参数(如m.match(“.*”(.*“+group+”*).*)。但这是在猜测OP输入可能是什么,我不希望对需求使用占卜;)如果变量中有空格呢:这里是:a:func('var 1','var 2','var 3',2)?如果要包含空格,它会变得更复杂一些。你不能只使用单词间距。我会更新正则表达式。