1

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

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

4

6 回答 6

2

使用惰性版本.*

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

如果你避开第一个点会更好。

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

jsfiddle 演示

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

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

正则表达式101演示

于 2013-09-29T14:55:10.017 回答
1

replace and match我相信它可以通过方法调用单行完成:

var str = '.js("aaa").js("bbb").js("ccc")';

str.replace(/[^(]*\("([^"]*)"\)[^(]*/g, '$1,').match(/[^,]+/g);
//=> ["aaa", "bbb", "ccc"]
于 2013-09-29T14:59:06.933 回答
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);
于 2013-09-29T15:25:05.097 回答
0

为了确保匹配的字符被相同的引号包围:

/\.js\((['"])(.*?)\1\)/g
于 2013-09-29T15:40:24.773 回答
0

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

尽可能匹配,并且不捕获组 1,因此匹配

"aaa").js("bbb").js("ccc"

但鉴于您的示例输入。

尝试

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

为了打破这一点,

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

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

您正在反复进行全局匹配,这没有任何意义。

摆脱g修饰符,然后事情应该会更好。

于 2013-09-29T14:55:07.160 回答
0

问题是您正在使用.*. 这将匹配任何字符。您必须更具体地了解您要捕获的内容。

如果它只是单词字符,您可以使用\w它匹配任何单词字符。这包括[a-zA-Z0-9_]:大写、小写、数字和下划线。

所以你的正则表达式看起来像这样:

var jsReg = /js\(['"](\w*)['"]\)/g;
于 2013-09-29T14:55:13.750 回答