带有可选捕获组的 JavaScript 正则表达式 - 匹配 mongo 查询

标签 javascript regex mongodb

我正在尝试编写一个正则表达式来解析 Mongo 类型查询,如下所示:

db.users.find({
    name : 'Joe Black'
})

或者这个:

db.users.updateMany({
    name : 'Joe Black'
}, {
    foo : 'bar'
})

目标:我尝试分别提取此字符串中的 2 个对象 {}。第一个对象是必需的,第二个对象是可选的。

解析第一个字符串应该返回

{
    name : 'Joe Black'
}

解析第二个字符串应该返回

{
    foo : 'bar'
}

到目前为止我所得到的是这个正则表达式,它让我获得了一部分:

^(?:db\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+\()({(.|[\r\n])*})(?=\))

您可以在这里尝试:https://regex101.com/r/lQ4lE4/1

目前我拥有的正则表达式只是捕获 {} 括号中的所有内容。

我当前正则表达式的详细信息:

1) 与字符串 'db.user.updateMany(' 匹配) 的非捕获组

^(?:db\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+\()

2) 捕获与括号中的所有内容匹配的组{}

{(.|[\r\n])*})

3) 正向前瞻断言 end 是 a )

(?=\))

我也尝试过这样的事情:

^(?:db).*.(?:[a-zA-Z0-9])\(({(.|[\r\n])*})(?=(?:[,\r\n])*)(?=\))

这是相同的正则表达式,但具有积极的前瞻

' , '

我不知道如何选择性地捕获第二组括号,与第一组括号分开。

最佳答案

你可以尝试类似的方法

/^db\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+\(({[\s\S]*?}(?=\s*,|\)))(?:\s*,\s*({[\s\S]*?})‌​(?=[),]|$))?/gm

正则表达式匹配:

  • ^db\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+\( - 一个db.<alphanum+>.<alphanum+>(类似序列
  • ({[\s\S]*?}(?=\s*,|\))) - 捕获第 1 组匹配:
    • { - 左大括号
    • [\s\S]*? - 任意数量的任意字符,直到第一个
    • } - 字面右大括号是...
    • (?=\s*,|\)) - 紧跟 0 个或多个空白符号和逗号或文字 )
  • (?:\s*,\s*({[\s\S]*?})‌​(?=[),]|$))? - 并可选择匹配以下序列:
    • \s*,\s* - 0 个或多个空格,后跟一个逗号,后跟 0 个或多个空格
    • ({[\s\S]*?})‌​(?=[),]|$) - 捕获组 2 匹配:
      • { - 左大括号
      • [\s\S]*? - 到达第一个所需的符号数量尽可能少...
      • } - 右大括号...
      • (?=[),]|$) - 后面跟着),或字符串结尾。

请参阅regex demo

关于带有可选捕获组的 JavaScript 正则表达式 - 匹配 mongo 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156403/

相关文章:

java - 在java中用 "\"字符替换字符串

node.js - Nodejs - 检查 MongoDB 中的空对象并解析它

c# - 用于验证 URL 或域名的正则表达式。

Javascript如何解析JSON数组

javascript - 滑动横幅 90% HTML+CSS3 10% JS

javascript - 如何在 php 代码中的 javascript 代码中使用 php 变量?

JavaScript RegExp - 查找特定字符之前的所有前缀

python - 集合中的正则表达式

mongodb keep_mutation阶段解释

ruby - MongoDB Ruby 驱动程序的问题