如何在Javascript正则表达式中使用未捕获的元素?

如何在Javascript正则表达式中使用未捕获的元素?,javascript,regex,Javascript,Regex,我想在nothing中全局捕获东西,不区分大小写 出于某种原因,这不起作用: "Nothing thing nothing".match(/no(thing)/gi); 捕获的数组是Nothing,Nothing,而不是thing,thing 我想?我做错了什么 (是的,我知道这在nothiness中也会匹配)括号在这个正则表达式中没有任何作用 正则表达式/no(thing)/gi与/nothing/gi相同 括号用于分组。如果您没有对组进行任何引用(使用$1、$2)或对组进行计数,则()是

我想在
nothing
中全局捕获
东西
,不区分大小写

出于某种原因,这不起作用:

"Nothing thing nothing".match(/no(thing)/gi);

捕获的数组是
Nothing,Nothing
,而不是
thing,thing

我想?我做错了什么


(是的,我知道这在
nothiness
中也会匹配)

括号在这个正则表达式中没有任何作用

正则表达式
/no(thing)/gi
/nothing/gi
相同

括号用于分组。如果您没有对组进行任何引用(使用$1、$2)或对组进行计数,则()是无用的

所以,这个正则表达式只能找到这个序列n-o-t-h-i-n-g。单词
thing
不是以“no”开头的,因此它不匹配


编辑:

更改为
/(否)?thing/gi
,即可工作。
因为()会起作用吗?指示可选部分。

如果使用全局标志,则该方法将返回所有整体匹配。这相当于在没有全局匹配的情况下获得的每个匹配数组的第一个元素

要从每个匹配中获取所有组,请循环:

var match;
while(match = /no(thing)/gi.exec("Nothing thing nothing")) 
{ 
  // Do something with match
}

这将为您提供
[“Nothing”,“thing”]
[“Nothing”,“thing”]

括号或否,始终捕获整个匹配的子字符串--将其视为默认捕获组。显式捕获组所做的是使您能够处理整个匹配中较小的文本块

您链接到的教程确实在标题“模式分隔符”下列出了分组构造,但这是错误的,实际描述也不是很好:

(模式),(?:模式)
匹配整个包含的模式

当然,他们会匹配它(或尝试)!但括号所做的是将整个包含的子模式视为一个单元,因此您可以(例如)向其中添加一个量词:

(?:foo){3}  // "foofoofoo"
(?:…)
是一个纯粹的分组构造,而
(…)
还捕获包含的子模式匹配的任何内容


只需快速浏览一下,我就发现了更多不准确、含糊不清或不完整描述的例子。我建议您立即取消该教程的书签,并将其改为书签:。

好的,那么您如何在
;中找到
东西
)(反对票不是我的,顺便说一句)对不起。我在问题中读到的是“物与无”,而不是“物中无”。所以你什么都不要。现在我明白了,谢谢。这确实有效,但出于某种原因,我只是认为有一种更简单的方法可以做到这一点:阅读Javascript:好的部分,这是Crockford的建议。