繁体   English   中英

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

[英]Javascript regex with optional capture groups - matching a mongo query

我正在尝试编写一个正则表达式来解析像这样的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])*)(?=\))

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

' , '

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

您可以尝试类似

/^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]+\\( -a db.<alphanum+>.<alphanum+>( -类似序列
  • ({[\\s\\S]*?}(?=\\s*,|\\))) -捕获组1匹配:
    • { -左括号
    • [\\s\\S]*? -任意数量的任意字符,直到第一个
    • } -文字右大括号是...
    • (?=\\s*,|\\)) -紧随其后的是0个或多个空格符号以及逗号或文字)
  • (?:\\s*,\\s*({[\\s\\S]*?})‌​(?=[),]|$))? -并可选地匹配以下顺序:
    • \\s*,\\s* -0或多个空格,后跟一个逗号,后跟0或多个空格
    • ({[\\s\\S]*?})‌​(?=[),]|$) -捕获第2组匹配项:
      • { -左括号
      • [\\s\\S]*? -到达第一个所需的符号越少...
      • } -关闭括号...
      • (?=[),]|$) -后跟),或字符串的结尾。

正则表达式演示

您可以使用以下内容:

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

参见RegEX演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM