Javascript正则表达式不对

时间:2013-09-29 14:49:19

标签: javascript regex

这是一个字符串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""]

这个正则表达式出了什么问题?

6 个答案:

答案 0 :(得分:2)

使用惰性版.*

/\.js\(['"](.*?)['"]\)/g
              ^

如果你逃离第一个点,那会更好。

这将匹配最少数量的字符,直到下一个引用。

jsfiddle demo

如果您想允许转义引号,请使用以下内容:

/\.js\(['"]((?:\\['"]|[^"])+)['"]\)/g

regex101 demo

答案 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\(('(?:[^\\']|\\.)*'|"(?:[\\"]|\\.)*"))\)/

要打破这种局面,

  1. \.匹配文字点
  2. \.js\(匹配文字字符串“.js(”
  3. (开始捕获字符串。
  4. [^\\']|\\.匹配引号或反斜杠以外的字符或转义的非行终止符。
  5. (?:[\\']|\\.)*匹配字符串的正文
  6. '(?:[\\']|\\.)*'匹配单引号字符串
  7. (...|...)捕获单引号或双引号字符串
  8. )\)关闭捕获组并匹配文字右括号

  9. 第二个主要问题是你的循环。

    你正在重复进行全局比赛,这没有任何意义。

    摆脱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