本文介紹正則表達式的匹配方式以及特殊字符的轉義處理。
完全匹配
正則表達式的值與字符串完全一致,則是完全匹配。例如1234
與\d+
完全匹配。
有些函數支持部分匹配,您可以在開頭與結尾添加^
與$
將部分匹配的場景變成完全匹配。例如正則表達式為^正則表達式$
。更多信息,請參見正則表達式操作。
不同函數的匹配模式如表格所示。
分類 | 函數 | 匹配模式 |
---|---|---|
全局操作函數 | 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字段的值匹配。等同于完全匹配模式。
字符轉義
正則表達式中可能會包含特殊字符,如果需要獲取這些字符本身的含義,就需要進行轉義。 您可以通過以下方法進行轉義:
- 通過反斜線(\)進行轉義
更多信息,請參見字符轉義。
- 通過
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
如果正則表達式中同時存在普通分組和命名分組,那么分組的編號規則是先對普通捕獲組進行編號,再對命名捕獲組進行編號。日志服務支持在表達式或程序中直接引用自定義的捕獲組組名。
非捕獲組
非捕獲組不會將匹配到的文本內容緩存到內存中,形式上非捕獲組的半角圓括號()
中以?:
開頭。
例如您要查找program和project,則正則表達式可以為
pro(gram|ject)
。如果您不希望將正則表達式匹配的內容緩存到內存中,則可以使用pro(?:gram|ject)
進行非捕獲匹配。
說明
(?:x)
表示匹配x
但是不緩存匹配項,可以定義與正則表達式運算符一起使用的子表達式。