gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:35:42 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com