[英]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]*?
-到达第一个所需的符号越少... }
-关闭括号... (?=[),]|$)
-后跟)
或,
或字符串的结尾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.