作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个正则表达式来解析 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!