该$regexFindAll
操作的语法如下:
领域 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
输入 | |||||||||||
正则表达式 | 要应用的正则表达式模式。可以是任何可解析为字符串或正则表达式模式的有效表达式
另外,您也可以在options字段中指定正则表达式选项
。要指定 您不能在 |
||||||||||
选项 | 可选的。以下内容 注意 您不能在
|
$regexFindAll
和排序规则¶$regexFindAll
忽略为collection指定的归类db.collection.aggregate()
和索引(如果使用)。
例如,创建一个具有整理强度的样本集合
1
(即仅比较基本字符而忽略其他区别,例如大小写和变音符号):
插入以下文件:
使用集合的排序规则,以下操作将执行不区分大小写和不区分音素的匹配:
该操作返回以下3个文档:
但是,聚合表达式会$regexFind
忽略排序规则;也就是说,以下正则表达式模式匹配示例区分大小写和变音符号:
这两个操作都返回以下内容:
captures
输出行为¶如果您的正则表达式模式包含捕获组,并且该模式在input中找到匹配项
captures
,则结果中的数组将与匹配字符串捕获的组相对应。捕获组()
在
正则表达式模式中用不转义的括号指定。captures
阵列的长度
等于模式中捕获组的数量,并且阵列的顺序与捕获组出现的顺序匹配。
创建一个contacts
使用以下文档命名的样本集合:
以下管道将正则表达式
模式/(C(ar)*)ol/
应用于fname
字段:
该正则表达式模式找到具有匹配fname
值Carol
和Colleen
:
模式包含捕获组(C(ar)*)
,捕获组包含嵌套组(ar)
。captures
数组中的元素对应于两个捕获组。如果某个组(例如Colleen
和组(ar)
)
没有捕获到匹配的文档,则$regexFindAll
用空的占位符替换该组。
如上例所示,该captures
数组包含每个捕获组的元素(null
用于非捕获)。考虑以下示例,该示例通过将or
捕获组逻辑应用于phone
字段来搜索带有纽约市区号的电话号码。每个组代表一个纽约市区号:
对于正则表达式
模式匹配的文档,captures
数组包括匹配的捕获组,并用替换所有非捕获组null
:
$regexFindAll
及其选项¶为了说明$regexFindAll
此示例中讨论的操作员的行为,请products
使用以下文档创建样本集合:
默认情况下,$regexFindAll
执行区分大小写的匹配。例如,以下聚合在字段上区分大小写
。正则表达式模式不指定任何分组:$regexFindAll
description
/line/
该操作返回以下内容:
以下正则表达式模式在模式中/lin(e|k)/
指定了一个分组
(e|k)
:
该操作返回以下内容:
在return选项中,该idx
字段是代码点索引,而不是字节索引。为了说明,请考虑以下使用regex模式的示例/tier/
:
该操作返回以下内容,其中只有最后一条记录与模式匹配,并且返回的idx
是2
(如果使用字节索引,则返回3)
i
选项¶注意
您不能在regex
和
options
字段中同时指定选项。
要执行不区分大小写的模式匹配,请在正则表达式字段或选项 字段中包括i选项:
例如,以下聚合对字段执行不区分大小写
$regexFindAll
的操作description
。正则表达式模式/line/
不指定任何分组:
该操作返回以下文档: