[英]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.