全部產品
Search
文件中心

Simple Log Service:Regex

更新時間:Jun 30, 2024

本文介紹Regex的匹配方式以及特殊字元的轉義處理。

完全符合

Regex的值與字串完全一致,則是完全符合。例如1234\d+完全符合。

有些函數支援部分匹配,您可以在開頭與結尾添加^$將部分匹配的情境變成完全符合。例如Regex為^Regex$。更多資訊,請參見Regular expression operations

不同函數的匹配模式如表格所示。
分類函數匹配模式
全域操作函數e_regex部分匹配
e_keep_fields完全符合
e_drop_fields完全符合
e_rename完全符合
e_kv部分匹配
e_search_dict_map部分匹配
e_search_table_map部分匹配
運算式函數e_match參數控制,預設為完全符合。
e_search部分匹配
regex_select部分匹配
regex_findall部分匹配
regex_match參數控制,預設為部分匹配。
regex_replace部分匹配
regex_split部分匹配
匹配模式樣本。
  • regex_match("abc123", r"\d+"):匹配。預設為部分匹配模式。
  • regex_match("abc123", r"\d+", full=True):不匹配。設定了完全符合模式。
  • regex_match("abc123", r"^\d+$"):不匹配。等同於完全符合模式。
  • e_search(r'status~="\d+"'):根據status欄位的值匹配。等同於部分匹配模式。
  • e_search(r'status~="^\d+$"'):根據status欄位的值匹配。等同於完全符合模式。

字元轉義

Regex中可能會包含特殊字元,如果需要擷取這些字元本身的含義,就需要進行轉義。 您可以通過以下方法進行轉義:
  • 通過反斜線(\)進行轉義

    更多資訊,請參見字元轉義

  • 通過str_regex_escape函數進行轉義。
    • 例如e_drop_fields(str_regex_escape("abc.test"))表示丟棄欄位abc.test
    • 例如e_drop_fields("abc.test")則表示丟棄符合abc?test的欄位,其中半形問號(?)表示任一字元。

分組

分組是將需要重複的運算式用半形圓括弧()包裹起來,然後對這個運算式進行重複引用。以下樣本為分組和不分組的區別:
"""
處理前日誌為:
SourceIP: 192.0.2.1
處理後日誌為:
SourceIP: 192.0.2.1
ip: 192.0.2.1
"""
# 不分組:
e_regex("SourceIP",r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","ip")
# 分組:
e_regex("SourceIP", "\d{1,3}(.\d{1,3}){3}", "ip")

擷取的群組

擷取的群組會將捕獲到的常值內容緩衝在記憶體中,可以通過反向引用在其他運算式中使用。形式上擷取的群組的半形圓括弧()中不是以?:開頭。

預設情況下,每個擷取的群組會自動擁有一個編號。從左向右,以分組的左括弧為標誌,第一個出現的分組的編號為1,第二個為2,以此類推。例如如下樣本擁有3個分組:
(\d{4})-(\d{2}-(\d{2}))

1     1 2      3     32

如果Regex中同時存在普通分組和命名分組,那麼分組的編號規則是先對普通擷取的群組進行編號,再對命名擷取的群組進行編號。Log Service支援在運算式或程式中直接引用自訂的擷取的群組組名。

非擷取的群組

非擷取的群組不會將匹配到的常值內容緩衝到記憶體中,形式上非擷取的群組的半形圓括弧()中以?:開頭。

例如您要尋找programproject,則Regex可以為pro(gram|ject)。如果您不希望將Regex匹配的內容緩衝到記憶體中,則可以使用pro(?:gram|ject)進行非捕獲匹配。
說明 (?:x)表示匹配x但是不緩衝匹配項,可以定義與Regex運算子一起使用的子運算式。