2
 var s = "lala url(ok) tee hee url( oh ya ) kk";
 s.match( /url(([^)]+))/g );

从's'我试图提取:

 ['ok', ' oh ya ']

但是,得到:

 ["url(ok", "url( oh ya "]

我可以遍历该列表并删除“url(”,但我怀疑一些正则表达式也可以删除它。

4

4 回答 4

2

在其他语言中,正则表达式支持通过使用像这样的正则表达式来向后看(?<=url\()(([^)]+))

但不幸的是,javascript regex 不支持像这个例子那样的lookbehind ,所以你必须迭代它。除非您真的不需要包含该url单词。

于 2013-08-10T15:43:21.010 回答
1

即使在修复表达式之后,当您使用g标志 和.match时,捕获组捕获的值也不包含在结果中。

但是你仍然可以通过使用得到你想要的.exec

var s = "lala url(ok) tee hee url( oh ya ) kk";
var pattern = /url\(([^)]+)\)/g;
var urls = [];
var match;
while(match = pattern.exec(s)) {
    // match is an array like ["url(ok)", "ok"]
    urls.push(result[1]);
}

// urls will be ["ok", " oh ya "]

在每次迭代中,match将是一个数组,其中包含完整匹配作为第一个元素,每个捕获组的值作为数组的进一步元素。

于 2013-08-10T17:00:32.973 回答
1

您需要将第一组括号转义为

 s.match( /url\(([^)]+)\)/g );

请注意,okandoh ya将成为捕获组的一部分,而不是直接匹配。

您可以按以下方式检索捕获组:

var str = "lala url(ok) tee hee url( oh ya ) kk",
    re = /\(([^)]+)\)/g, match ;

while( (match = re.exec( str )) !== null )
    console.log( match[0] + " : " + match[1] );

/* Prints:
   url(ok) : ok
   url( oh ya ) :  oh ya 
*/
于 2013-08-10T15:38:17.787 回答
0

代替:

s.match( /url(([^)]+))/g );

上:

s.match( /url\(([^)]+)\)/g );
于 2013-08-10T15:40:28.197 回答