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

时间:2010-08-18 01:31:44

标签: javascript regex

我希望全局捕获thing nothing并且不区分大小写。

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

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

jsFiddle

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

我想parentheses delimit the matching pattern?我究竟做错了什么?

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

3 个答案:

答案 0 :(得分:5)

如果使用全局标志,match方法将返回所有整体匹配。这相当于没有全局的每个匹配数组的第一个元素。

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

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

这将为您提供["Nothing", "thing"]["nothing", "thing"]

答案 1 :(得分:1)

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

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

  

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

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

(?:foo){3}  // "foofoofoo"

(?:...)是纯粹的分组构造,而(...)也捕获包含的子模式匹配的任何内容。

通过快速浏览,我发现了几个不准确,含糊不清或不完整的描述的例子。我建议您立即取消对该教程的书签,并将其加入书签:regular-expressions.info

答案 2 :(得分:0)

圆括号在此正则表达式中不执行任何操作。

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

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

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


修改

更改为/(no)?thing/gi并将有效。 会工作因为()?表示可选部分。