这让我很困惑,不过我认为问题很简单。
鉴于这段代码:
var text = ' url("https://") repeat scroll 0% 0%, url("https://") repeat scroll 0% 0%, url("https://") repeat scroll 0% 0% red';
var result = /(url)/.exec(text);
我得到的结果为["url", "url"]
..我希望["url", "url", "url"]
任何解释为什么它只捕获2个url实例而不是3个
由于
接受回答的更新
实际上这是我正在为HeadJS重写的Modernizr函数的一部分,所以最后的函数将是:
function multiplebgs() {
var ele = document.createElement('div');
var style = ele.style;
style.cssText = 'background:url(https://),url(https://),red url(https://)';
// If the UA supports multiple backgrounds, there should be three occurrences
// of the string "url(" in the return value for elemStyle.background
var result = (style.background || "").match(/url/g);
return Object.prototype.toString.call( result ) === '[object Array]' && result.length === 3;
}
console.log(multiplebgs());
现在可以在支持的浏览器上正确返回。
如果有人发现其他问题,请发表评论,谢谢!
答案 0 :(得分:3)
将match
与带有g
标志的正则表达式一起使用:
var text = ' url("https://") repeat scroll 0% 0%, url("https://") repeat scroll 0% 0%, url("https://") repeat scroll 0% 0% red';
var result = (text || "").match(/url/g);
result // => ["url", "url", "url"]
答案 1 :(得分:1)
将您的正则表达式设为全局并改为使用match
。您也不需要捕获组。
var result = text.match(/url/g);
与全局标志一起使用时, exec
也允许您获取所有匹配项,但是当您有多个捕获组时,exec
会更有用。在你的情况下,要获得与exec的所有匹配,你必须做类似的事情:
var matches = [],
urlRx = /url/g,
match;
while (match = urlRx.exec(text)) {
matches.push(match[0]);
}
console.log(matches);
答案 2 :(得分:1)
第二行与您的情况相同:
'url url url'.match(/url/) // ["url"]
'url url url'.match(/(url)/) // ["url", "url"]
'url url url'.match(/url/g) // ["url", "url", "url"]
'url url url'.match(/(url)/g) // ["url", "url", "url"] same as previous line
考虑/(url)/
,括号内的内容等同于“子正则表达式”,称为子模式或组。除了使用全局标志(//g
)之外,每个组的捕获方式与整个模式相同。在这种情况下,将忽略组,并且捕获整个模式的次数与文本中的次数相同。这个例子将更加明确:
'hello world!hello world!'.match(/hello (world)(!)/)
// ["hello world!", "world", "!"]
// [entire pattern, group 1, group 2]
'hello world!hello world!'.match(/hello (world)(!)/g)
// ["hello world!", "hello world!"]
// [entire pattern, entire pattern]
在javascript中查看有关正则表达式的优秀资源:http://www.javascriptkit.com/javatutors/redev.shtml