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