Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regexp,多次匹配一个单词_Javascript_Regex - Fatal编程技术网

Javascript Regexp,多次匹配一个单词

Javascript Regexp,多次匹配一个单词,javascript,regex,Javascript,Regex,这使我困惑,尽管我认为问题很简单 鉴于这段代码: 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个ur

这使我困惑,尽管我认为问题很简单

鉴于这段代码:

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重写的Modernizer函数的一部分,所以最后的函数是:

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())
现在将在支持的浏览器上正确返回true


如果有人看到这方面的其他问题,请留下评论,谢谢

使用带有
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"]

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"]

将正则表达式设置为全局,并使用
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);

将正则表达式设置为全局,并使用
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);

第二行相当于您的情况:

'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)/
,括号内的内容相当于一个称为子模式或组的“sub regex”。除使用全局标志(
//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中正则表达式的优秀资源:

第二行与您的情况相当:

'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)/
,括号内的内容相当于一个称为子模式或组的“sub regex”。除使用全局标志(
//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中正则表达式的这一重要资源:

您误解了
RegExp.exec()
的返回值。阅读(特别是“返回值”部分)。@ajp15243啊,现在更有意义了
返回的数组将匹配的文本作为第一项,然后每个捕获括号对应一项
Yup:)。正如现有答案所表明的那样,您可能需要。您误解了
RegExp.exec()
的返回值。阅读(特别是“返回值”部分)。@ajp15243啊,现在更有意义了
返回的数组将匹配的文本作为第一项,然后每个捕获括号对应一项
Yup:)。正如现有答案所表明的,您可能需要。问题是“text”可以为null或未定义。仍然不明白为什么它能够匹配2个实例,而不是3个..因为其中有3个string@Robert见我对你问题的评论。如果从正则表达式中删除
()
,请检查
.exec()
返回的内容。好的,匹配会很好,只需将其更改为:
(text | | |“”).match(/url/g)
,因为文本可以为空/未定义,并且会引发错误error@falsetru接受,并用我试图解决的实际用例更新我的问题。感谢问题是“文本”可以为空或未定义。仍然不明白为什么它能够匹配2个实例,而不是3个..因为其中有3个string@Robert见我对你问题的评论。如果从正则表达式中删除
()
,请检查
.exec()
返回的内容。好的,匹配会很好,只需将其更改为:
(text | | |“”).match(/url/g)
,因为文本可以为空/未定义,并且会引发错误error@falsetru接受,并用我试图解决的实际用例更新我的问题。谢谢