基于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
答案 0 :(得分:1)
将g
标记与match
一起使用只会匹配整个匹配项,而不是匹配项。通常,您将在while循环中使用exec来解决此问题。不那么简洁,但应该有效。
var match, matches = [];
while (match = regex.exec(contents) ) {
matches.push(match[1], match[2]);
}