全部產品
Search
文件中心

Simple Log Service:Regex入門教程

更新時間:Jun 30, 2024

Regex是一種強大的文本匹配工具,可以用於在文本中尋找特定的模式。本文將提供簡單且實用的Regex快速上手教程,協助您快速掌握其基本用法。​

重要

本文檔可能包含第三方產品資訊,該資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。

如果您對Regex不夠熟悉,可以使用Regex101等工具進行練習和調試。這些工具支援直觀展示Regex和文本的匹配過程。本文以Regex101為例,介紹各個樣本。

基本文法

Regex由不同類型的字元組成,包括一般字元、元字元、分隔字元和逸出字元等。其中:

  • 一般字元:用於匹配文本中出現的相同字元。

  • 元字元:用於匹配特定的字元或字元集合。例如.表示匹配任一字元,\d表示匹配數字等。

  • 分隔字元:用於標記Regex的開始和結束,通常為/或者#

  • 逸出字元:使用\將有特殊作用的字元(元字元、分隔字元等)轉義為一般字元。例如\.表示匹配半形句號。

如下圖所示,Regex101工具預設在Regexa.\d\.前添加了分隔字元/。其中,a表示匹配字母a,.表示匹配一個任一字元,\d表示匹配一個任一數字,\.表示匹配半形句號。image.png

下表羅列了常用的特殊字元及其含義。

重要

在不同的程式設計語言和Regex引擎中,支援的符號和文法可能有所差異。在實際編程中,需要結合具體的語言和工具瞭解其支援的Regex文法。

符號

含義

.

匹配任意一個字元,除了分行符號。

\d

匹配任意一個數字字元,等價於[0-9]。

\D

匹配除數字字元之外的任一字元,等價於[^0-9]。

\w

匹配任意一個字母、數字或底線,等價於[A-Za-z0-9_]。

\W

匹配除字母、數字和底線之外的任一字元,等價於[^A-Za-z0-9_]。

\s

匹配任意一個空白字元,包括空格、定位字元、分行符號等。

\S

匹配除空白字元之外的任一字元。

\b

匹配單詞邊界,即單詞字元和非單詞字元的交界處。

\B

匹配非單詞邊界。

*

匹配前面的字元0次或多次。

+

匹配前面的字元1次或多次。

?

匹配前面的字元0次或1次。

|

將兩個匹配邏輯進行或運算。

{n}

匹配前面的字元n次。

{n,}

匹配前面的字元至少n次。

{n,m}

匹配前面的字元至少n次,但不超過m次。

[abc]

匹配字元集中的任意一個字元。

[^abc]

匹配除字元集中的字元之外的任一字元。

^

匹配字串的開頭。

$

匹配字串的結尾。

()

分組,將括弧內的一組字元看作一個整體。

/

常用分隔字元,用於標記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以/作為分隔字元,因此需要使用逸出字元\將其轉變為一般字元,即需要在/前增加逸出字元\

image.png

樣本二:匹配手機號碼

篩選出包含以111或222開頭的11位手機號碼的日誌。

  • 範例:11144445555、22266667777、33388889999

  • Regex:(111|222)\d{8}

    手機號碼前三位是電訊廠商號碼,中間四位是地區編碼,後四位則是任一數字。假設電訊廠商號碼只有111和222,地區編碼為任一數字。

    • (111|222)表示一個分組,包含了兩個可能的值,即111或222。

    • \d表示匹配一個數字。

    • {8}表示前面的\d需要匹配8次,即匹配8個數字。

image.png

樣本三:匹配一個完整字串

篩選出格式為[時間] [層級] [模組] [資訊]的日誌,其中時間為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 字元串。

image.png

樣本四:匹配不以某關鍵詞開頭的字串

篩選出不以DEBUG開頭的日誌。

  • 日誌範例:DEBUG: test debug、INFO: test info

  • Regex:^(?!DEBUG).*

    • ^表示字串的開始位置,即DEBUG是處於字串的開頭位置。

    • (?!DEBUG)表示排除包含DEBUG的日誌。(?!DEBUG)為正向否定預查,格式為(?!<pattern>),其中<pattern>為需要排除的內容。

    • .*表示匹配任一字元,直到該行日誌結束。

image.png

樣本五:匹配不包含關鍵詞的字串

篩選出不包含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的日誌。

    • .*用於匹配任一字元,直到該行日誌結束。

image.png

參考連結