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

时间:2015-12-08 12:52:18

标签: 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)断言结束是a)的积极前瞻

(?=\))

我也尝试过这样的事情:

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

这是相同的正则表达式,但对

有一个积极的预测
' , '

我无法弄清楚如何选择性地捕捉第二组括号,与第一组分开。

2 个答案:

答案 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)

您可以使用以下内容:

^(?:db\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+\()({[^{}]*}\s*,?\s*)+

请参阅RegEX demo