这是一个字符串str = '.js("aaa").js("bbb").js("ccc")'
,我想写一个正则表达式来返回一个这样的数组:
[aaa, bbb, ccc];
我的正则表达式是:
var jsReg = /.js\(['"](.*)['"]\)/g;
var jsAssets = [];
var js;
while ((js = jsReg.exec(find)) !== null) {
jsAssets.push(js[1]);
}
但是jsAssets结果是
[""aaa").js("bbb").js("ccc""]
这个正则表达式出了什么问题?
答案 0 :(得分:2)
使用惰性版.*
:
/\.js\(['"](.*?)['"]\)/g
^
如果你逃离第一个点,那会更好。
这将匹配最少数量的字符,直到下一个引用。
如果您想允许转义引号,请使用以下内容:
/\.js\(['"]((?:\\['"]|[^"])+)['"]\)/g
答案 1 :(得分:1)
我相信可以通过replace and match
方法调用在单行中完成:
var str = '.js("aaa").js("bbb").js("ccc")';
str.replace(/[^(]*\("([^"]*)"\)[^(]*/g, '$1,').match(/[^,]+/g);
//=> ["aaa", "bbb", "ccc"]
答案 2 :(得分:0)
在
/.js\(['"](.*)['"]\)/g
尽可能匹配,并且不捕获组1,因此匹配
"aaa").js("bbb").js("ccc"
但是给出了您的示例输入。
尝试
/\.js\(('(?:[^\\']|\\.)*'|"(?:[\\"]|\\.)*"))\)/
要打破这种局面,
\.
匹配文字点\.js\(
匹配文字字符串“.js(”(
开始捕获字符串。[^\\']|\\.
匹配引号或反斜杠以外的字符或转义的非行终止符。(?:[\\']|\\.)*
匹配字符串的正文'(?:[\\']|\\.)*'
匹配单引号字符串(...|...)
捕获单引号或双引号字符串)\)
关闭捕获组并匹配文字右括号第二个主要问题是你的循环。
你正在重复进行全局比赛,这没有任何意义。
摆脱g
修饰符,然后事情应该更好。
答案 3 :(得分:0)
问题是您使用的是.*
。这将匹配任何角色。您必须更加具体地了解您要捕获的内容。
如果它只是单词字符,你可以使用匹配任何单词字符的\w
。这包括[a-zA-Z0-9_]
:大写,小写,数字和下划线。
所以你的正则表达式看起来像这样:
var jsReg = /js\(['"](\w*)['"]\)/g;
答案 4 :(得分:0)
试试这个 - http://jsfiddle.net/UDYAq/
var str = new String('.js("aaa").js("bbb").js("ccc")');
var regex = /\.js\(\"(.*?)\"\){1,}/gi;
var result = [];
result = str.match (regex);
for (i in result) {
result[i] = result[i].match(/\"(.*?)\"/i)[1];
}
console.log (result);
答案 5 :(得分:0)
确保匹配的字符被相同的引号括起来:
/\.js\((['"])(.*?)\1\)/g