我正在尝试编写一个正则表达式来解析 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/