本文介紹正則式函數基本文法及樣本。
Log Service支援如下正則式函數(Regex採用RE2文法)。
函數名稱 | 文法 | 說明 | 支援SQL | 支援SPL |
regexp_extract_all(x, regular expression) | 提取目標字串中符合Regex的子串,並返回所有子串的集合。 | √ | × | |
regexp_extract_all(x, regular expression, n) | 提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的子串集合。 | √ | × | |
regexp_extract(x, regular expression) | 提取並返回目標字串中符合Regex的第一個子串。 | √ | √ | |
regexp_extract(x, regular expression, n) | 提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的第一個子串。 | √ | √ | |
regexp_extract_bool(x, regular expression) | 提取並返回目標字串中符合Regex的子串,並轉換為boolean類型,轉換失敗返回 | √ | × | |
regexp_extract_bool(x, regular expression, n) | 提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的子串,並轉換為boolean類型,轉換失敗返回 | √ | × | |
regexp_extract_long(x, regular expression) | 提取並返回目標字串中符合Regex的子串,並轉換為bigint類型,轉換失敗返回 | √ | × | |
regexp_extract_long(x, regular expression, n) | 提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的子串,並轉換為bigint類型,轉換失敗返回 | √ | × | |
regexp_extract_double(x, regular expression) | 提取並返回目標字串中符合Regex的第一個子串,並轉換為double類型,轉換失敗返回 | √ | × | |
regexp_extract_double(x, regular expression, n) | 提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的子串,並轉換為double類型,轉換失敗返回 | √ | × | |
regexp_like(x, regular expression) | 判斷目標字串是否符合Regex。 | √ | √ | |
regexp_replace(x, regular expression) | 刪除目標字串中符合Regex的子串,返回未被刪除的子串。 | √ | √ | |
regexp_replace(x, regular expression, replace string) | 替換目標字串中符合Regex的子串,返回被替換後的字串。 | √ | √ | |
regexp_split(x, regular expression) | 使用Regex分割目標字串,返回被分割後的子串集合。 | √ | × |
使用正則式函數提取字串中的單引號(')時,需要在Regex中再添加一個單引號(')進行提取。具體樣本,請參見regexp_extract函數(樣本3)。
regexp_extract_all函數
regexp_extract_all函數用於提取目標字串中符合Regex的子串。
文法
提取目標字串中符合Regex的子串,並返回所有子串的集合。
regexp_extract_all(x, regular expression)
提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的子串集合。
regexp_extract_all(x, regular expression, n)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | 包含擷取的群組的Regex。例如 |
n | 第n個擷取的群組。n為從1開始的整數。 |
傳回值類型
array類型。
樣本
樣本1:提取
server_protocol
欄位值中所有的數字。欄位範例
server_protocol:HTTP/2.0
查詢和分析語句(調試)
*| SELECT regexp_extract_all(server_protocol, '\d+')
查詢和分析結果
樣本2:提取
http_user_agent
欄位值中的Chrome部分,然後統計由Chrome瀏覽器發起的請求數量。欄位範例
http_user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1
查詢和分析語句(調試)
*| SELECT regexp_extract_all(http_user_agent, '(Chrome)',1) AS Chrome, count(*) AS count GROUP BY Chrome
查詢和分析結果
regexp_extract函數
regexp_extract函數用於提取目標字串中符合Regex的子串。
文法
提取並返回目標字串中符合Regex的第一個子串。
regexp_extract(x, regular expression)
提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的第一個子串。
regexp_extract(x, regular expression, n)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | 包含擷取的群組的Regex。例如 |
n | 第n個擷取的群組。n為從1開始的整數。 |
傳回值類型
varchar類型。
樣本
SQL
樣本1:提取
server_protocol
欄位值中的第一個數字。欄位範例
server_protocol:HTTP/2.0
查詢和分析語句(調試)
*|SELECT regexp_extract(server_protocol, '\d+')
查詢和分析結果
樣本2:提取
request_uri
欄位值中的檔案部分,然後統計各個檔案的訪問次數。欄位範例
request_uri:/request/path-3/file-5
查詢和分析語句(調試)
* | SELECT regexp_extract(request_uri, '.*\/(file.*)', 1) AS file, count(*) AS count GROUP BY file
查詢和分析結果
樣本3:提取
message
欄位值中的單引號(')和數字部分。欄位範例
message:error'1232
查詢和分析語句
* | SELECT regexp_extract(message, '''\d+')
說明使用正則式函數提取字串中的單引號(')時,需要在Regex中再添加一個單引號(')。
查詢和分析結果
SPL
樣本1:提取server_protocol欄位值中的第一個數字。
欄位範例
server_protocol:HTTP/2.0
查詢和分析語句
* | extend a = regexp_extract(server_protocol, '\d+')
查詢和分析結果
樣本2:提取
request_uri
欄位值中的檔案部分。欄位範例
request_uri:/request/path-3/file-5
查詢和分析語句
* | extend a = regexp_extract(request_uri, '.*\/(file.*)',1)
查詢和分析結果
樣本3:提取
message
欄位值中的單引號(')和數字部分。欄位範例
message:error'1232
查詢和分析語句
* | extend a = regexp_extract(message, '''\d+')
說明
使用Regex函數提取字串中的單引號(')時,需要在Regex中再添加一個單引號(')。
查詢和分析結果
regexp_extract_bool函數
regexp_extract_bool函數用於提取目標字串中符合Regex的子串,並轉換成boolean類型,轉換失敗返回null
。當該子串為"true"或"false"(不區分大小寫)時才轉換成功。
文法
提取並返回目標字串中符合Regex的子串,並轉換為boolean類型,轉換失敗返回
null
。regexp_extract_bool(x, regular expression)
提取目標字串中符合Regex的子串,然後返回與指定擷取的群組匹配的子串,並轉換為boolean類型,轉換失敗返回
null
。regexp_extract_bool(x, regular expression, n)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | 包含擷取的群組的Regex。例如 |
n | 第n個擷取的群組。n為從1開始的整數。 |
傳回值類型
boolean類型。
樣本
提取欄位值中的boolean值。
欄位範例
false
查詢和分析語句(調試)
*| select regexp_extract_bool('false', '[a-zA-Z]+')
查詢和分析結果
regexp_extract_long函數
regexp_extract_long函數用於提取目標字串中符合Regex的子串,並轉換成bigint類型,轉換失敗返回null
。
文法
提取並返回目標字串中符合Regex的子串,並轉換成bigint類型,轉換失敗返回
null
。regexp_extract_long(x, regular expression)
提取目標字串中符合Regex的子串,然後返回與目標擷取的群組匹配的子串,並轉換成bigint類型,轉換失敗返回
null
。regexp_extract_long(x, regular expression, n)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | 包含擷取的群組的Regex。例如 |
n | 第n個擷取的群組。n為從1開始的整數。 |
傳回值類型
bigint類型。
樣本
提取
time
欄位中的數字。欄位範例
time:19/Dec/2024:06:16:06
查詢和分析語句(調試)
*|SELECT regexp_extract_long(time, '(\d{2})/', 1)
查詢和分析結果
regexp_extract_double函數
regexp_extract_double函數用於提取目標字串中符合Regex的子串,並轉換成double類型,轉換失敗返回null
。
文法
提取並返回目標字串中符合Regex的子串,並轉換成double類型,轉換失敗返回
null
。regexp_extract_double(x, regular expression)
提取目標字串中符合Regex的子串,返回與目標擷取的群組匹配的子串,並轉換成double類型,轉換失敗返回
null
。regexp_extract_double(x, regular expression, n)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | 包含擷取的群組的Regex。例如 |
n | 第n個擷取的群組。n為從1開始的整數。 |
傳回值類型
double類型。
樣本
提取
server_protocol
欄位中的數字。欄位範例
server_protocol:HTTP/1.1
查詢和分析語句(調試)
*|SELECT regexp_extract_double(server_protocol, '\d+')
查詢和分析結果
regexp_like函數
regexp_like函數用於判斷目標字串是否符合Regex。
文法
regexp_like(x, regular expression)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | Regex。 |
傳回值類型
boolean類型。
樣本
SQL
判斷server_protocol欄位值中是否包含數字。
欄位範例
server_protocol:HTTP/2.0
查詢和分析語句(調試)
*| select regexp_like(server_protocol, '\d+')
查詢和分析結果
SPL
判斷server_protocol欄位值中是否包含數字
欄位範例
server_protocol:HTTP/2.0
查詢和分析語句
* |extend a = regexp_like(server_protocol, '\d+')
查詢和分析結果
regexp_replace函數
刪除或替換目標字串中符合Regex的子串。
文法
刪除目標字串中符合Regex的子串,返回未被刪除的子串。
regexp_replace(x, regular expression)
替換目標字串中符合Regex的子串,返回被替換後的字串。
regexp_replace(x, regular expression, replace string)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | Regex。 |
replace string | 用於替換的子串。 |
傳回值類型
varchar類型。
樣本
SQL
樣本1:將
region
欄位值中以cn
開頭的地區名都替換為中國,然後統計來自中國的請求數量。欄位範例
region:cn-shanghai
查詢和分析語句(調試)
* | select regexp_replace(region, 'cn.*','中國') AS region, count(*) AS count GROUP BY region
查詢和分析結果
樣本2:刪除
server_protocol
欄位值中的版本號碼部分,然後統計不同通訊協定對應的請求數量。欄位範例
server_protocol:HTTP/2.0
查詢和分析語句(調試)
*| select regexp_replace(server_protocol, '.\d+') AS server_protocol, count(*) AS count GROUP BY server_protocol
查詢和分析結果
SPL
樣本1:將
region
欄位值中以cn開頭的地區名都替換為中國。欄位範例
region:cn-shanghai
查詢和分析語句
* | extend a = regexp_replace(region, 'cn.*','中國')
查詢和分析結果
樣本2:刪除
server_protocol
欄位值中的版本號碼部分。欄位範例
server_protocol:HTTP/2.0
查詢和分析語句(調試)
* | extend a = regexp_replace(server_protocol, '.\d+')
查詢和分析結果
regexp_split函數
regexp_split函數用於分割目標字串,返回被分割後的子串集合。
文法
regexp_split(x, regular expression)
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
regular expression | Regex。 |
傳回值類型
array類型。
樣本
使用正斜線(/)分割request_uri
欄位的值。
欄位範例
request_uri:/request/path-0/file-7
查詢和分析語句(調試)
* | SELECT regexp_split(request_uri,'/')
查詢和分析結果