Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / / /

正则表达式(Regex)

在此页面上

  • 定义
  • 语法
  • 选项
  • 行为
  • Lucene 正则表达式行为
  • 示例
regex

regexquery 字段解释为正则表达式。regex 是术语级操作符,因而不会分析 query 字段。

提示

另请参阅:

  • 分析器。

  • 分析字段示例。

注意

regex 操作符可用的正则表达式语言为 PCRE 库的有限子集。

有关详细信息,请参阅 RegExp 类 文档。

regex 通过以下语法实现:

1{
2 $search: {
3 "index": <index name>, // optional, defaults to "default"
4 "regex": {
5 "query": "<search-string>",
6 "path": "<field-to-search>",
7 "allowAnalyzedField": <boolean>,
8 "score": <options>
9 }
10 }
11}

regex 使用以下词条来构造查询:

字段
类型
说明
必要性
默认
query
字符串或字符串数组
要搜索的一个或多个字符串。
path
字符串或字符串数组
要搜索的一个或多个带索引字段。还可以指定通配符路径进行搜索。有关更多信息,请参阅路径构造
allowAnalyzedField
布尔
如果针对分析字段运行查询,则必须设置为 true
no
false
score
对象

分配给匹配搜索词结果的分数。选项包括:

  • boost将生成的分数乘以给定数字。

  • constant将结果分数替换为给定数字。

  • function:使用给定的表达式替换结果分数。

no

regex 为词级运算符,因而不会分析 query 字段。正则表达式搜索与关键字分析器配合得很好,因为它一次只能索引一个单词的字段。要进行区分大小写的搜索,请勿使用默认分析器(标准分析器),因为 standard 分析器会小写所有术语。请改为指定其他分析器

通过将 allowAnalyzedField 选项设置为 true,可以使用 regex 运算符对分析后的字段执行搜索,但可能会出现意外结果。

例子

在使用 keyword 分析器进行索引的字段上搜索*Star Trek*,即可查找该字段在任何上下文中包含字符串 Star Trek 的所有文档。在使用标准分析器进行索引的字段上搜索 *Star Trek* 找不到任何结果,因为 StarTrek 之间有空格,而索引并不包含空格。

Atlas Search regex 操作符使用 Lucene 正则表达式引擎,它不同于 Perl 兼容正则表达式。

在正则表达式中使用时,以下字符保留为操作符:

. ? + * | { } [ ] ( ) < > " \ @ #

要在匹配表达式中按字面意思使用任何上述字符,请在其前面添加\字符。

例子

who\? 匹配 "who?"

mongosh 中或驱动程序中使用转义字符时,必须在要转义的字符前使用双反斜杠。

例子

要创建一个通配符表达式来搜索聚合管道中包含字面星号的任何字符串,请使用以下表达式:

"*\\**"

第一个和最后一个星号作为通配符,可匹配任何字符,而 \\* 则匹配文字星号。

注意

使用以下表达式对文本反斜杠进行转义:

"*\\\*"
Operator
说明
例子
.
匹配任何字符。
x.z matches "xyz", "xaz", etc.
?
前面的字符是可选的,如果其出现次数不超过一次,则匹配。
xyz? 与“xy”和“xyz”匹配
+
如果前面的字符出现一次或多次,则匹配。
xy+ 匹配 " xy "、" xyy "、" xyyy " 等
*
如果前面的字符出现任意次数,则匹配。
xyz* 匹配“xy”、“xyz”、“xyzz”等。
|
OR 操作符。如果 | 运算符两侧的两个模式中的较长者匹配,则表达式匹配。
abc|xyz 匹配 "abc" 或 "xyz"
{<number>}
如果前面的字符恰好出现 <number> 次,则匹配。
xyz{3} 匹配 "xyzzz"
()
括号内的字符在匹配时被视为一个单元。
xyz(abc)[2] 匹配“xyzabcabc”
[]

与方括号内的任何字符匹配。

在开头添加 ^ 将匹配除方括号内字符之外的任何字符。

在方括号内,- 表示范围,除非 - 是第一个字符或用 \ 转义。

[xyz] matches "x", "y", and "z"
[^abc] matches any character except "a", "b", or "c"
[a-d] matches "a", "b", "c", or "d"
[0-9] matches any numeric character from 0 through 9
<>
匹配数值范围。
<1-3> 匹配“1”、“2”和“3”
#
空语言操作符。# 操作符不匹配任何字符串,包括空字符串。
#|xyz 与“xyz”匹配,无其他匹配项

regex 不支持锚定操作符 ^$

以下示例将 sample_mflix 数据库的 movies 集合与使用关键字分析器的自定义索引定义结合使用。如果集群有示例数据集,则可以在 movies 集合上创建 Atlas Search 索引,并在集群上运行示例查询。

提示

如果您已经加载示例数据集,请按照 Atlas Search 入门教程,创建索引定义并运行 Atlas Search 查询。

以下索引定义使用关键字分析器movies 集合中的 title 字段进行索引:

1{
2 "mappings": {
3 "fields": {
4 "title": {
5 "analyzer": "lucene.keyword",
6 "type": "string"
7 }
8 }
9 }
10}

以下示例在所有 title 字段中搜索以单词 Seattle 结尾的电影标题。(.*) 正则表达式匹配任意数量的字符。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": "(.*) Seattle"
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])

以上查询返回以下结果:

{ "title" : "Sleepless in Seattle" }
{ "title" : "Battle in Seattle" }

以下示例使用正则表达式 [0-9]{2} (.){4}s 查找以 2 位数字开头,后跟 1 个空格,并以最后 1 个字母为 s 的 5 个字母单词结尾的电影标题。

1db.movies.aggregate([
2 {
3 "$search": {
4 "regex": {
5 "path": "title",
6 "query": "[0-9]{2} (.){4}s"
7 }
8 }
9 },
10 {
11 $project: {
12 "_id": 0,
13 "title": 1
14 }
15 }
16])

以上查询返回以下结果:

{ "title" : "20 Dates" }
{ "title" : "25 Watts" }
{ "title" : "21 Grams" }
{ "title" : "13 Lakes" }
{ "title" : "18 Meals" }
{ "title" : "17 Girls" }
{ "title" : "16 Acres" }
{ "title" : "26 Years" }
{ "title" : "99 Homes" }
{ "title" : "45 Years" }

后退

范围