簡體   English   中英

Grok 模式/正則表達式解析帶嵌套括號的字符串

[英]Grok pattern/Regex to parse string with nested parenthesis

我正在嘗試通過()之間的日志消息中存在的 Grok/Regex 解析出幾個動態字符串。 例如(下面的SenderPartyName ):

2021/05/23 16:01:26.094 High Messaging.Message.Delivered Id(ci1653336085475.12327434@test_te) MessageId(EPIUM#1130754#84601671) SenderPartyName(Mcdonalds (CFH) Restaurant Glen) ReceiverPartyName(TEST_HERE_AGAIN) SenderRoutingId(08Mdsfkm853)

我想從遵循 () 格式的字符串中解析出每個鍵值。 到目前為止,這是我的 grok 模式。 我一直在測試https://grokdebug.herokuapp.com/

%{DATESTAMP:ts} %{WORD:loglevel} %{DATA:reason}\s ?(Id\(%{DATA:id}\))? ?(MessageId\(%{DATA:originalmessageid}\))? ?(SenderPartyName\((?<senderpartyname>.+?\).+?)\))? ?(ReceiverPartyName\(%{DATA:receiverpartyname}\))? ?(SenderRoutingId\(%{DATA:senderroutingid}\))?

這在嵌套字符串中有()時有效,如下所示: Mcdonalds (CFH) Restaurant Glen

...但它是動態的,可能會在沒有 () 的情況下出現,例如: Mcdonalds Restaurant Glen

嘗試使用 grok 模式的這一部分構建正則表達式以解決這兩種情況:

?(SenderPartyName\((?<senderpartyname>.+?\).+?)\))?

目前這會像這樣解析非括號的情況:

  "senderpartyname": "Mcdonalds Restaurant Glen) ReceiverPartyName(TEST_HERE_AGAIN"

..where desired state 是以下之一,具體取決於字符串:

"senderpartyname": "Mcdonalds Restaurant Glen"

或者

"senderpartyname": "Mcdonalds (CFH) Restaurant Glen"

您可以使用

%{DATESTAMP:ts}\s+%{WORD:loglevel}\s+%{DATA:reason}\s+Id\(%{DATA:id}\)(?:\s+MessageId\(%{DATA:originalmessageid}\))?(?:\s+SenderPartyName(?<senderpartyname>\((?:[^()]++|\g<senderpartyname>)*\)))?(?:\s+ReceiverPartyName\(%{DATA:receiverpartyname}\))?(?:\s+SenderRoutingId\(%{DATA:senderroutingid}\))?

請注意,我修改了它,以便所有可選字段匹配一個或多個空格,並將字段作為強制模式,但它們作為一個序列可選,這使得匹配更有效。

主要改變的是(?:\s+SenderPartyName(?<senderpartyname>\((?:[^()]++|\g<senderpartyname>)*\)))? , 它匹配

  • (?: - 非捕獲組的開始:
    • \s+ - 一個或多個空格
    • SenderPartyName - 一個固定的詞
    • (?<senderpartyname>\((?:[^()]++|\g<senderpartyname>)*\)) - 組“senderpartyname”: ( (與\(匹配,然后任何字符的零次或多次重復除了( and )或遞歸的組“senderpartyname”模式(參見(?:[^()]++|\g<senderpartyname>)* )然后 a ) char(與\)匹配)
  • )? - 小組結束,一次或零次重復(可選)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM