簡體   English   中英

RegEx 從日志文件中提取 substring

[英]RegEx extract a substring from log file

我正在使用 JavaScript,我需要解析一個日志文件以提取 substring。

這是我的日志文件的示例:

Feb 04 11:20:48 info: VPN disconnected: admin @ 6051:abcdefgh [NB017] (duration: 00:05:32)
Feb 04 12:59:21 info: VPN connected: admin @ 6051:abcdefgh [NB017]
Feb 04 12:59:21 info: Connected to 123.123.123.123 (TLS)
Feb 04 12:59:21 info: Data tunnel connected: 
Feb 04 12:59:21 info: Data tunnel operational!
Feb 04 12:59:53 info: VPN disconnected: admin @ 6051:abcdefgh [NB017] (duration: 00:00:32)
Feb 04 13:01:03 info: VPN connected: admin @ 6051:abcdefgh [NB017]
Feb 04 13:01:03 info: Connected to 123.123.123.123 (TLS)
Feb 04 13:01:03 info: Data tunnel connected: 
Feb 04 13:01:03 info: Data tunnel operational!
Feb 04 13:01:35 info: VPN disconnected: admin @ 6051:abcdefgh [NB017] (duration: 00:00:40)
Feb 04 13:49:26 info: VPN connected: admin @ 6051:abcdefgh [NB017]
Feb 04 13:49:27 info: VPN disconnected: admin @ 6051:abcdefgh [NB017] (duration: 00:00:09)
Feb 04 13:50:06 info: VPN connected: admin @ 6051:abcdefgh [NB017]
Feb 04 13:50:06 info: Connected to 123.123.123.123 (TLS)
Feb 04 13:50:06 info: Data tunnel connected: 
Feb 04 13:50:07 info: Data tunnel operational!
Feb 04 15:37:57 info: (Log Displayed)

我需要提取最后一個連接的用戶,因為日志中有多個連接。

例如從“VPN connected:”開始到最后一個“]”。

我試過這個正則表達式

VPN connected([^.]+)]

但是當我只需要最后一個時,JS會返回幾個日志。

如何改進 mi RegEx?

您可以通過從生成的 JavaScript 數組中獲取最后一個捕獲組或通過修改您的 RegEx 來解決此問題:

(VPN connected[^\]]+\])(?![\s\S]*\1)

首先,我認為您要捕獲單獨VPN connected

VPN connected[^\]]+\]

這將從“VPN connected”開始,到下一個右括號結束。

然后我添加了一個負前瞻組(由?!表示)。 該組查找任何空白和非空白,然后是我們的第一個捕獲組。 負前瞻將確保我們在第一場比賽之后沒有另一場比賽。 這導致我們的第一場比賽是最后一場比賽:-)

編輯:第一個捕獲組的澄清說明

Edit2:由於您希望擁有用戶,因此可以將 RegEx 擴展為如下所示:

(VPN connected: (\w+)[^\]]+\])(?![\s\S]*\1)

應該在第二組中找到該用戶。

注意:根據用戶名中允許的字符,可能需要進行一些調整。

暫無
暫無

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

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