我有一个字符串被送入JavaScript函数,我需要将变量拉出来。
var str = "heres:a:func('var1', 'var2', 'var3', 2)"
我越来越近了,但想用一个正则表达式来做。
str.match(/\((.*)\)/)[1].split(/\s*,\s*/)
结果应如下所示:
['var1', 'var2', 'var3', 2]
答案 0 :(得分:1)
这应该('\w+'|\d+)
它会在单引号或(\w
)数字未引用的值之间捕获单词(|
=字母数字和连字符)。
请参阅演示here
代码示例:
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"]
答案 1 :(得分:1)
这是一种方法:
顺便说一下,这不包括引号,如果需要,可以选择添加引号。
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 Link
包含多个空格:Regex101 Link
<强> EDIT2:强>
就像最后一个,如果你真的想要在整个过程中添加一堆空格,你可以这样做:
包含多个空格,多次:Regex101 Link
/([\w]+[\s\w]+[\w]+|\w+)(?!.*\()(?=.*\))/g
答案 2 :(得分:0)
你可以使用一行,但仍然有2个正则表达式:1)删除所有直到开头(
和结束)
,然后在带有可选空格的逗号上拆分。这样我们就可以获得所有var
s,无论有多少变量。
var str = "heres:a:func('var1', 'var2', 'var3', 2)";
alert(str.replace(/.*\(|\s*\)\s*$/g, '').split(/\s*,\s*/));
&#13;
此外,您可能会尝试一种奇特的正则表达式,但它不安全(只有在数据格式正确的情况下才有效):
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/>";
}
&#13;
<div id="res"/>
&#13;
答案 3 :(得分:0)
由于我无法添加评论,我发布了答案。
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);
}
&#13;
或者在这里尝试一下: https://jsfiddle.net/oz3Ljfe1/3/