正则表达式:捕获组?

时间:2014-08-07 12:18:33

标签: regex mongodb

我想知道是否可以在MongoDB中使用捕获组。

例如,假设我有一个只有全名的用户集合,我想得到他们的名字和姓氏。

以下是我使用捕获组的想法:

bulk.find( { full_name: /<first_name>(.*) <last_name>(.*)/i } ).upsert().replaceOne(
   {
     first_name: <first_name>,
     last_name: <last_name>
   }
);
bulk.execute();

是否可以只使用MongoDB?你会怎么做?

2 个答案:

答案 0 :(得分:3)

也许使用javascript:

doc here:http://docs.mongodb.org/manual/reference/method/cursor.forEach/

示例:

db.collection.find().forEach(function(e) {
var fullName = e.full_name
e.firstname = full_name.substring(\*something*\)
e.lastname = full_name.substring(\*something*\)
db.collection.save(e);
 });

答案 1 :(得分:0)

MongoDB 4.2 版(2019 年 8 月发布)提供了 regexFind operator。来自文档:

<块引用>

提供正则表达式(regex)模式匹配能力 聚合表达式。如果找到匹配项,则返回一个文档 包含有关第一场比赛的信息...如果您的正则表达式模式 包含捕获组并且模式在输入中找到匹配项, 结果中的捕获数组对应于捕获的组 通过匹配的字符串。

语法:

{ $regexFind: { input: <expression> , regex: <expression>, options: <expression> } }

例如(我没有验证您的正则表达式是否符合您的要求)

db.collection.aggregate([
  {
    $project: {
      names: {
        $regexFind: { input: "$phone", regex: /(.*) (.*)/i }
      }
    }
  }
])

输出将是

{ "names" : { "match" : "John Doe", "idx" : 0, "captures" : [ "John", "Doe" ] } }