如何在Javascript正则表达式中同时使用分组表达式和全局标志?

时间:2015-02-03 07:16:35

标签: javascript regex

基于this MDN example, 我期望以下String.prototype.match()带有正则表达式:

var contents = '            <i class="sprite-lib-name--image-name"></i>';
var regex = /\<i\s[^\>]*class\=[\"\']sprite-([\w-]+)--([\w-]+)[\"\'][^\>]*\>/gim ;
contents.match(regex);

...产生这个预期的输出:

["<i class=\"sprite-lib-name--image-name\">", "lib-name", "image-name"]

...但是我得到了这个实际输出:

["<i class="sprite-lib-name--image-name">"]

不确定为什么([\w-]+)组表达式不起作用。

但是,当我删除全局匹配标志(g)时, 匹配按预期工作。

var contents = '            <i class="sprite-lib-name--image-name"></i>';
var regex = /\<i\s[^\>]*class\=[\"\']sprite-([\w-]+)--([\w-]+)[\"\'][^\>]*\>/im ;
contents.match(regex);
//Output: ["<i class=\"sprite-lib-name--image-name\">", "lib-name", "image-name"]

麻烦的是我需要同时进行组表达式匹配和全局匹配。 我怎么能做到这一点?

var contents = '            <i class="sprite-lib-name--image-name"></i> <i class="sprite-lib-name--another-image"></i>';
var regex = /\<i\s[^\>]*class\=[\"\']sprite-([\w-]+)--([\w-]+)[\"\'][^\>]*\>/im ;
contents.match(regex);
//Output: ["<i class=\"sprite-lib-name--image-name\">", "lib-name", "image-name"]
//Second output missing

1 个答案:

答案 0 :(得分:1)

g标记与match一起使用只会匹配整个匹配项,而不是匹配项。通常,您将在while循环中使用exec来解决此问题。不那么简洁,但应该有效。

var match, matches = [];
while (match = regex.exec(contents) ) {
    matches.push(match[1], match[2]);
}