我正在尝试编写一个正则表达式来解析像这样的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)断言结束是a)的积极前瞻
(?=\))
我也尝试过这样的事情:
^(?:db).*.(?:[a-zA-Z0-9])\(({(.|[\r\n])*})(?=(?:[,\r\n])*)(?=\))
这是相同的正则表达式,但对
有一个积极的预测' , '
我无法弄清楚如何选择性地捕捉第二组括号,与第一组分开。
答案 0 :(得分:1)
您可以尝试类似
的内容/^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
答案 1 :(得分:0)