$regex

在本页面

Definition

要使用$regex,请使用以下语法之一:

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }

在 MongoDB 中,您还可以使用正则表达式对象(即/pattern/)来指定正则表达式:

{ <field>: /pattern/<options> }

有关特定语法使用的限制,请参见$ regex vs./pattern/语法

以下<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/ ] } }

不能$in内使用$regex运算符表达式。

字段的隐式 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运算符一起使用。例如,要指定is选项,则必须同时使用$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." }
首页