Javascript中的match方法:仅返回子模式匹配的内容

4
"unescape('awefawef')unescape('efawefwf')unescape('awefawef')"
.match(/unescape\(\'([^\)]+)\'\)/gi)

如果有多个unescape(...)匹配,它会返回带有unescape的匹配项,但我只需要()括号内的内容。
谢谢;)
['awefawef','efawefwf','awefawef']

当然,已添加到主帖中。 - Somebody
3个回答

5
你需要使用非贪婪运算符来匹配括号内的内容,并且为了获得所有的结果,你需要在同一个字符串上多次调用RegExp.exec。
var regex = /unescape\('(.+?)'\)/ig;
var string = "this unescape('foo') is a unescape('bar') test";
var result;
while(result = regex.exec(string))
    console.log(result[1]);

请问您能否提供一些关于JavaScript正则表达式中非贪婪操作符的链接?谢谢 :) - Somebody
这不仅适用于JS,而且适用于它: http://www.regular-expressions.info/repeat.html#greedy - Alex Turpin
为什么使用这个非贪婪操作符时,.match方法不起作用呢? - Somebody
它能够执行。match 的唯一问题是,每次调用它时,它不会不断返回匹配结果。根据全局标志的存在,它只会给出第一个或所有匹配结果但包含模式。 - Alex Turpin
谢谢提供文档,我现在明白了。因为我之前对于问号的作用感到困惑,我记得它有另外一个用途。但是如果它放在加号或乘号后面,它就与它们相关了。 - Somebody
如果您发现了其中一个答案有帮助,请考虑将其接受为您问题的答案。 - Alex Turpin

2

你可以从 RegExp.$1 中获取它。

"unescape('awefawef')unescape('efawefwf')unescape('awefawef')".match(/unescape\(\'([^\)]+)\'\)/gi);
console.log(RegExp.$1); //awefawef

1
哇,太酷了,我不知道那个。但是那不是全局的吗?其他匹配怎么办? - Somebody

1

如果想要使用捕获功能,您可以使用 Regex.exec() 方法。以您的情况为例:

var str = "unescape('foo')unescape('bar')unescape('baz')";
var regex = /unescape\(\'([^']+)\'\)/g;

var result;
while( result = regex.exec(str) ){
    alert(result[1]);
}

编辑:修正原始答案


是的,似乎最好在所需结果或执行返回 null 之前循环执行。谢谢 ;) - Somebody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接