我希望全局捕获thing
nothing
并且不区分大小写。
出于某种原因,这不起作用:
"Nothing thing nothing".match(/no(thing)/gi);
捕获的数组是Nothing,nothing
而不是thing,thing
。
我想parentheses delimit the matching pattern?我究竟做错了什么?
(是的,我知道这也会在nothingness
中匹配)
答案 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
并将有效。
会工作因为()?表示可选部分。