在javascript中不使用while循环条件执行组提取? 脚本

在javascript中不使用while循环条件执行组提取? 脚本,javascript,regex,Javascript,Regex,从多个CSS url函数表示法中提取url。 给定项目中的以下css值: 我需要一个URL字符串数组,比如[../fonts/glyphicons-halflings-regular.eot?iefix,../fonts/glyphicons-halflings-regular.woff2,…] 解决方案 现在,我使用while循环和正则表达式匹配器通过CSS解析器从解析的声明中提取URL字符串: var decValue = "url(foo), url(bar)"; // no data U

从多个CSS url函数表示法中提取url。 给定项目中的以下css值:

我需要一个URL字符串数组,比如[../fonts/glyphicons-halflings-regular.eot?iefix,../fonts/glyphicons-halflings-regular.woff2,…]

解决方案 现在,我使用while循环和正则表达式匹配器通过CSS解析器从解析的声明中提取URL字符串:

var decValue = "url(foo), url(bar)";
// no data URI
var regexp = new RegExp(/url\(([^\(|^\)|^\"|^\']+)\)/g),
    matches = [],
    match;

while (match = regexp.exec(decValue), match !== null) {
    if (match[1].indexOf("data:") === -1) {
        matches.push(match[1]);
    }
}

// should print ["foo", "bar"]
console.log(matches);
问题
有没有一种方法可以不使用while循环而保持组匹配?要避免while循环,您可以将分组逻辑移到map函数中,并使用String.prototype.match全局获取所有匹配:

var decValue = "url(foo), url(bar)";

// no data URI
var urlExp = /url\([^)]+\)/g,
    uriExp = /\(["']?([^)]+)["']?\)/;

var matches = decValue.match(urlExp).map(function (url) {
    return uriExp.exec(url)[1];
});    

// should print ["foo", "bar"]
console.log(matches);

不幸的是,要求您分解正则表达式,但这或多或少只是通过迭代器模式进行分组提取。

为了避免while循环,您可以将分组逻辑移入map函数,并使用String.prototype.match全局获取所有匹配:

var decValue = "url(foo), url(bar)";

// no data URI
var urlExp = /url\([^)]+\)/g,
    uriExp = /\(["']?([^)]+)["']?\)/;

var matches = decValue.match(urlExp).map(function (url) {
    return uriExp.exec(url)[1];
});    

// should print ["foo", "bar"]
console.log(matches);

不幸的是,它要求您分解正则表达式,但这或多或少只是通过迭代器模式进行分组提取。

因为javascript不支持lookbehind,所以当位置后面的文本很重要但您不想捕获它时,您必须发挥创意。此正则表达式包含单引号和双引号

这里有一个方法使用replace推送到数组,它不修改原始变量

var css=src:url'../font/glyphions-halflings-regular.eot?iefix'格式'embedded-opentype',url'../font/glyphions-halflings-regular.woff2'格式'woff2',url\../font/glyphions-halflings-regular.ttf格式'truetype',url“../fonts/glyphicons半身像规则。svgglyphicons_半身像规则”格式为“svg”; var garnerURLs=[]; css.replace/url\'[^']*'.[^]*.[^\]*\/g,functionmatch,p1{ 如果p1.charAt0=='| | p1.charAt0==\{ GarnerRurls.pushp1.substr1,p1.length-2 }否则{ 石榴石 } }; console.loggarnerURLs
logcss因为javascript不支持lookbehinds,所以当一个位置后面的文本很重要但你不想捕获它时,你必须要有创造性。此正则表达式包含单引号和双引号

这里有一个方法使用replace推送到数组,它不修改原始变量

var css=src:url'../font/glyphions-halflings-regular.eot?iefix'格式'embedded-opentype',url'../font/glyphions-halflings-regular.woff2'格式'woff2',url\../font/glyphions-halflings-regular.ttf格式'truetype',url“../fonts/glyphicons半身像规则。svgglyphicons_半身像规则”格式为“svg”; var garnerURLs=[]; css.replace/url\'[^']*'.[^]*.[^\]*\/g,functionmatch,p1{ 如果p1.charAt0=='| | p1.charAt0==\{ GarnerRurls.pushp1.substr1,p1.length-2 }否则{ 石榴石 } }; console.loggarnerURLs
console.logcssNote:。确实,已修复。谢谢。字符串替换为是while循环的另一种选择。谢谢注意:。事实上,已修复。谢谢。字符串替换为是while循环的另一种选择。谢谢你的第一个正则表达式很烂。我想你的意思是/url\[^']+\/g+1用于显示如何使用match+map,但在该正则表达式修复之前为-1。@Phrogz感谢您的评论,我太快了,无法从问题中复制正则表达式。我相信/url\[^]+\/g在这里起作用,然后您可以在第二个正则表达式中去掉可选的引号。由于某种原因,你发布的正则表达式。这是一个:你是对的,我对正则表达式意图的翻译不适用于引用的URL,如果你不介意包含引用字符,那么你现在所拥有的就可以了+1,用于显示带有全局标志的匹配将收集一系列结果。您的第一个正则表达式非常糟糕。我想你的意思是/url\[^']+\/g+1用于显示如何使用match+map,但在该正则表达式修复之前为-1。@Phrogz感谢您的评论,我太快了,无法从问题中复制正则表达式。我相信/url\[^]+\/g在这里起作用,然后您可以在第二个正则表达式中去掉可选的引号。由于某种原因,你发布的正则表达式。这是一个:你是对的,我对正则表达式意图的翻译不适用于引用的URL,如果你不介意包含引用字符,那么你现在所拥有的就可以了+1用于显示带有全局标志的匹配将收集一组结果。