On this page
$regex
在本页面
Definition
$regex
- 提供正则表达式功能,用于查询中的模式匹配字符串。在 MongoDB 3.6 系列中,
3 .6.16 使用支持 UTF-8 的 Perl 兼容正则表达式(即“ PCRE”)8.42 版。
3 .6.0-3.6.15 使用具有 UTF-8 支持的 Perl 兼容正则表达式(即“ PCRE”)版本 8.41.
要使用$regex,请使用以下语法之一:
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }
在 MongoDB 中,您还可以使用正则表达式对象(即/pattern/
)来指定正则表达式:
{ <field>: /pattern/<options> }
有关特定语法使用的限制,请参见$ regex vs./pattern/语法。
$options
以下<options>
可用于正则表达式。
Option | Description | Syntax Restrictions |
---|---|---|
i |
不区分大小写,以匹配大小写。有关示例,请参见执行不区分大小写的正则表达式匹配。 | |
m |
对于包含锚点的模式(即^ 表示开始,$ 表示结束),请在每行的开头或结尾匹配具有多行值的字符串。如果没有此选项,则这些锚点将在字符串的开头或结尾匹配。有关示例,请参见以指定模式开头的行的多行匹配。 |
|
如果模式不包含锚点,或者字符串值没有换行符(例如 \n ),则m 选项无效。 |
||
x |
“扩展”功能可忽略$regex模式中的所有空白字符,除非转义或包含在字符类中。 此外,它会忽略中间的字符,包括未转义的井号/磅( # )字符和下一个新行,因此您可以在复杂模式中添加 Comments。这仅适用于数据字符;空格字符可能永远不会出现在图案的特殊字符序列中。x 选项不会影响 VT 字符(即代码 11)的处理。 |
要求$regex 使用$options 语法 |
s |
允许点字符(即. )匹配所有字符,包括*换行符。有关示例,请参见使用 。点字符以匹配换行。 |
需要$regex 和$options 语法 |
Behavior
$ regex 与/ pattern /语法
$in Expressions
要在$in
查询表达式中包含正则表达式,您只能使用 JavaScript 正则对象(即/pattern/
)。例如:
{ name: { $in: [ /^acme/i, /^ack/ ] } }
字段的隐式 AND 条件
要将正则表达式包含在该字段的查询条件的逗号分隔列表中,请使用$regex运算符。例如:
{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: 'acme.*corp', $options: 'i', $nin: [ 'acmeblahcorp' ] } }
x 和 s 选项
要使用x
选项或s
选项,必须将_运算符表达式与$options运算符一起使用。例如,要指定i
和s
选项,则必须同时使用$options:
{ name: { $regex: /acme.*corp/, $options: "si" } }
{ name: { $regex: 'acme.*corp', $options: "si" } }
PCRE 与 JavaScript
要在 regex 模式中使用 JavaScript 不支持的 PCRE 支持的功能,必须将$regex运算符表达式与该模式一起用作字符串。例如,要在模式中使用(?i)
来为其余模式打开不区分大小写,并在(?-i)
模式中为其余模式打开不区分大小写,则必须将$regex运算符与模式一起用作字符串:
{ name: { $regex: '(?i)a(?-i)cme' } }
Index Use
对于区分大小写的正则表达式查询,如果该字段存在索引,则 MongoDB 会将正则表达式与索引中的值进行匹配,这可能比集合扫描更快。如果正则表达式是“前缀表达式”,则可能会发生进一步的优化,这意味着所有潜在的匹配都以相同的字符串开头。这允许 MongoDB 从该前缀构造一个“范围”,并且仅与索引中落入该范围的那些值匹配。
如果正则表达式以尖号(^
)或左锚(\A
)开头,后跟一串简单符号,则为“前缀表达式”。例如,将仅通过匹配索引中以abc
开头的值来优化 regex /^abc.*/
。
此外,虽然/^a/
,/^a.*/
和/^a.*$/
匹配等效的字符串,但它们具有不同的性能 Feature。如果存在适当的索引,则所有这些表达式都使用索引;但是,/^a.*/
和/^a.*$/
较慢。 /^a/
匹配前缀后可以停止扫描。
不区分大小写的正则表达式查询通常不能有效地使用索引。 $regex
实现不支持排序规则,并且无法使用不区分大小写的索引。
Examples
以下示例将集合products
与以下文档一起使用:
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }
进行喜欢的 match
以下示例匹配sku
字段类似于"%789"
的所有文档:
db.products.find( { sku: { $regex: /789$/ } } )
该示例类似于以下 SQL LIKE 语句:
SELECT * FROM products
WHERE sku like "%789";
执行不区分大小写的正则表达式匹配
以下示例使用i
选项对以ABC
开头的sku
值的文档执行不区分大小写的匹配。
db.products.find( { sku: { $regex: /^ABC/i } } )
该查询与以下文档匹配:
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
以指定模式开头的行的多行匹配
以下示例使用m
选项来匹配多行字符串中以字母S
开头的行:
db.products.find( { description: { $regex: /^S/, $options: 'm' } } )
该查询与以下文档匹配:
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
如果没有m
选项,则查询将仅匹配以下文档:
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
如果$regex模式不包含锚,则该模式将与整个字符串匹配,如以下示例所示:
db.products.find( { description: { $regex: /S/ } } )
然后,$regex将匹配两个文档:
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
使用。点字符以匹配换行
以下示例使用s
选项允许点字符(即.
)匹配所有字符,包括换行符,以及i
选项执行不区分大小写的匹配:
db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )
该查询与以下文档匹配:
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }
如果没有 s
选项,则查询将仅与以下文档匹配:
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }
忽略模式中的空格
下面的示例使用x
选项忽略空格和 Comments,在匹配模式中以#
表示并以\n
结尾:
var pattern = "abc #category code\n123 #item number"
db.products.find( { sku: { $regex: pattern, $options: "x" } } )
该查询与以下文档匹配:
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }