Regex是一種強大的文本匹配工具,可以用於在文本中尋找特定的模式。本文將提供簡單且實用的Regex快速上手教程,協助您快速掌握其基本用法。
本文檔可能包含第三方產品資訊,該資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
如果您對Regex不夠熟悉,可以使用Regex101等工具進行練習和調試。這些工具支援直觀展示Regex和文本的匹配過程。本文以Regex101為例,介紹各個樣本。
基本文法
Regex由不同類型的字元組成,包括一般字元、元字元、分隔字元和逸出字元等。其中:
一般字元:用於匹配文本中出現的相同字元。
元字元:用於匹配特定的字元或字元集合。例如
.
表示匹配任一字元,\d
表示匹配數字等。分隔字元:用於標記Regex的開始和結束,通常為
/
或者#
。逸出字元:使用
\
將有特殊作用的字元(元字元、分隔字元等)轉義為一般字元。例如\.
表示匹配半形句號。
如下圖所示,Regex101工具預設在Regexa.\d\.
前添加了分隔字元/
。其中,a
表示匹配字母a,.
表示匹配一個任一字元,\d
表示匹配一個任一數字,\.
表示匹配半形句號。
下表羅列了常用的特殊字元及其含義。
在不同的程式設計語言和Regex引擎中,支援的符號和文法可能有所差異。在實際編程中,需要結合具體的語言和工具瞭解其支援的Regex文法。
符號 | 含義 |
| 匹配任意一個字元,除了分行符號。 |
| 匹配任意一個數字字元,等價於[0-9]。 |
| 匹配除數字字元之外的任一字元,等價於[^0-9]。 |
| 匹配任意一個字母、數字或底線,等價於[A-Za-z0-9_]。 |
| 匹配除字母、數字和底線之外的任一字元,等價於[^A-Za-z0-9_]。 |
| 匹配任意一個空白字元,包括空格、定位字元、分行符號等。 |
| 匹配除空白字元之外的任一字元。 |
| 匹配單詞邊界,即單詞字元和非單詞字元的交界處。 |
| 匹配非單詞邊界。 |
| 匹配前面的字元0次或多次。 |
| 匹配前面的字元1次或多次。 |
| 匹配前面的字元0次或1次。 |
| 將兩個匹配邏輯進行或運算。 |
| 匹配前面的字元n次。 |
| 匹配前面的字元至少n次。 |
| 匹配前面的字元至少n次,但不超過m次。 |
| 匹配字元集中的任意一個字元。 |
| 匹配除字元集中的字元之外的任一字元。 |
| 匹配字串的開頭。 |
| 匹配字串的結尾。 |
| 分組,將括弧內的一組字元看作一個整體。 |
| 常用分隔字元,用於標記Regex的開頭和結尾。 |
| 逸出字元,使用 |
樣本
樣本一:匹配含有某個關鍵詞的字串
篩選出包含關鍵詞05/Jan/2023
的日誌。
日誌範例:Info 05/Jan/2023 Warning、Info 06/Jan/2023 Error
Regex:
.*05\/Jan\/2023.*
.*
表示匹配任意零個或多個字元,即05/Jan/2023
前後可以有任一字元。05\/Jan\/2023
表示匹配關鍵詞05/Jan/2023
。因為Logtail所支援的Regex以
/
作為分隔字元,因此需要使用逸出字元\
將其轉變為一般字元,即需要在/
前增加逸出字元\
。
樣本二:匹配手機號碼
篩選出包含以111或222開頭的11位手機號碼的日誌。
範例:11144445555、22266667777、33388889999
Regex:
(111|222)\d{8}
手機號碼前三位是電訊廠商號碼,中間四位是地區編碼,後四位則是任一數字。假設電訊廠商號碼只有111和222,地區編碼為任一數字。
(111|222)
表示一個分組,包含了兩個可能的值,即111或222。\d
表示匹配一個數字。{8}
表示前面的\d
需要匹配8次,即匹配8個數字。
樣本三:匹配一個完整字串
篩選出格式為[時間] [層級] [模組] [資訊]
的日誌,其中時間為yyyy-mm-dd hh:mm:ss
格式,層級包括DEBUG、INFO、WARN和ERROR,模組和資訊為任意的字串。
日誌範例:[2021-09-23 10:23:45] [INFO] [user login] [user login success]
Regex:
^\[\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\] \[(DEBUG|INFO|WARN|ERROR)\] \[.+\] \[.+\]$
\[
、\]
表示匹配[]
字元,因為[]
在正則文法中有特殊含義,因此需要添加逸出字元\
。\[\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\]
表示匹配日期和時間。\[(DEBUG|INFO|WARN|ERROR)\]
表示匹配各個記錄層級。\[.+\] \[.+\]$
表示匹配任意的非Null 字元串。
樣本四:匹配不以某關鍵詞開頭的字串
篩選出不以DEBUG開頭的日誌。
日誌範例:DEBUG: test debug、INFO: test info
Regex:
^(?!DEBUG).*
^
表示字串的開始位置,即DEBUG是處於字串的開頭位置。(?!DEBUG)
表示排除包含DEBUG的日誌。(?!DEBUG)
為正向否定預查,格式為(?!<pattern>)
,其中<pattern>
為需要排除的內容。.*
表示匹配任一字元,直到該行日誌結束。
樣本五:匹配不包含關鍵詞的字串
篩選出不包含INFO或DEBUG的日誌。
日誌範例:hello world、INFO、ERROR message、DEBUG、warning log、error INFO、debug detail、info status
Regex:
^(?!.*(INFO|DEBUG)).*
^
表示字串的開始位置,即INFO或DEBUG是處於字串的開頭位置。(?!.*(INFO|DEBUG))
表示排除包含INFO或DEBUG的日誌。.*
用於匹配任一字元,直到該行日誌結束。