簡體   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