本文介绍正则式函数的基本语法及示例。
正则式函数概览
日志服务支持如下正则式函数(正则表达式采用RE2语法)。
|
函数名称 |
语法 |
说明 |
支持SQL |
支持SPL |
|
regexp_extract_all(x, regular expression) |
提取目标字符串中符合正则表达式的子串,并返回所有子串的集合。 |
√ |
× |
|
|
regexp_extract_all(x, regular expression, n) |
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串集合。 |
√ |
× |
|
|
regexp_extract(x, regular expression) |
提取并返回目标字符串中符合正则表达式的第一个子串。 |
√ |
√ |
|
|
regexp_extract(x, regular expression, n) |
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的第n个子串。 |
√ |
√ |
|
|
regexp_extract_bool(x, regular expression) |
提取并返回目标字符串中符合正则表达式的子串,并转换为boolean类型,转换失败返回 |
√ |
× |
|
|
regexp_extract_bool(x, regular expression, n) |
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串,并转换为boolean类型,转换失败返回 |
√ |
× |
|
|
regexp_extract_long(x, regular expression) |
提取并返回目标字符串中符合正则表达式的子串,并转换为bigint类型,转换失败返回 |
√ |
× |
|
|
regexp_extract_long(x, regular expression, n) |
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串,并转换为bigint类型,转换失败返回 |
√ |
× |
|
|
regexp_extract_double(x, regular expression) |
提取并返回目标字符串中符合正则表达式的第一个子串,并转换为double类型,转换失败返回 |
√ |
× |
|
|
regexp_extract_double(x, regular expression, n) |
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串,并转换为double类型,转换失败返回 |
√ |
× |
|
|
regexp_extract_map(x, regular expression, keys) |
指定键信息,捕获组匹配子串作为值。 |
√ |
× |
|
|
regexp_extract_map(x, regular expression) |
正则包含2个捕获组,分别匹配键和值。 |
√ |
× |
|
|
regexp_like(x, regular expression) |
判断目标字符串是否符合正则表达式。 |
√ |
√ |
|
|
regexp_replace(x, regular expression) |
删除目标字符串中符合正则表达式的子串,返回未被删除的子串。 |
√ |
√ |
|
|
regexp_replace(x, regular expression, replace string) |
替换目标字符串中符合正则表达式的子串,返回被替换后的字符串。 |
√ |
√ |
|
|
regexp_split(x, regular expression) |
使用正则表达式分割目标字符串,返回被分割后的子串集合。 |
√ |
× |
使用正则式函数提取字符串中的单引号(')时,需要在正则表达式中再添加一个单引号(')进行提取。具体示例,请参见regexp_extract函数(示例3)。
regexp_extract_all函数
regexp_extract_all函数用于提取目标字符串中符合正则表达式的子串。
语法
-
提取目标字符串中符合正则表达式的子串,并返回所有子串的集合。
regexp_extract_all(x, regular expression) -
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串集合。
regexp_extract_all(x, regular expression, n)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
包含捕获组的正则表达式。例如 |
|
n |
第n个捕获组。n为从1开始的整数。 |
返回值类型
array类型。
示例
-
示例1:提取
server_protocol字段值中所有的数字。-
字段样例
server_protocol:HTTP/2.0 -
查询和分析语句(调试)
*| SELECT regexp_extract_all(server_protocol, '\d+') -
查询和分析结果:查询结果返回
_col0列值为["2","0"],即从HTTP/2.0中提取出的所有数字子串。
-
-
示例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 -
查询和分析结果:
Chrome列值为["Chrome"],count列值为103440。
-
regexp_extract函数
regexp_extract函数用于提取目标字符串中符合正则表达式的子串。
语法
-
提取并返回目标字符串中符合正则表达式的第一个子串。
regexp_extract(x, regular expression) -
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的第n个子串。
regexp_extract(x, regular expression, n)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
包含捕获组的正则表达式。例如 |
|
n |
第n个捕获组。n为从1开始的整数。 |
返回值类型
varchar类型。
示例
SQL
-
示例1:提取
server_protocol字段值中的第一个数字。-
字段样例
server_protocol:HTTP/2.0 -
查询和分析语句(调试)
*|SELECT regexp_extract(server_protocol, '\d+') -
查询和分析结果返回一列
_col0,值为2。
-
-
示例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 -
查询和分析结果示例:file 列为
file-5,count 列为17127。
-
-
示例3:提取
message字段值中的单引号(')和数字部分。-
字段样例
message:error'1232 -
查询和分析语句
* | SELECT regexp_extract(message, '''\d+')说明使用正则式函数提取字符串中的单引号(')时,需要在正则表达式中再添加一个单引号(')。
-
查询和分析结果为
'1232。
-
SPL
-
示例1:提取server_protocol字段值中的第一个数字。
-
字段样例
-
server_protocol:HTTP/2.0
-
查询和分析语句
* | extend a = regexp_extract(server_protocol, '\d+')
-
查询和分析结果
a: 2
-
示例2:提取
request_uri字段值中的文件部分。-
字段样例
-
request_uri:/request/path-3/file-5
-
查询和分析语句
* | extend a = regexp_extract(request_uri, '.*\/(file.*)',1)
-
查询和分析结果
提取结果为 a: file-5。
-
示例3:提取
message字段值中的单引号(')和数字部分。-
字段样例
-
message:error'1232
-
查询和分析语句
* | extend a = regexp_extract(message, '''\d+')
说明
使用正则表达式函数提取字符串中的单引号(')时,需要在正则表达式中再添加一个单引号(')。
-
查询和分析结果
1 12-19 10:39:33
a: '1232
regexp_extract_bool函数
regexp_extract_bool函数用于提取目标字符串中符合正则表达式的子串,并转换成boolean类型,转换失败返回null。当该子串为"true"或"false"(不区分大小写)时才转换成功。
语法
-
提取并返回目标字符串中符合正则表达式的子串,并转换为boolean类型,转换失败返回
null。regexp_extract_bool(x, regular expression) -
提取目标字符串中符合正则表达式的子串,然后返回与指定捕获组匹配的子串,并转换为boolean类型,转换失败返回
null。regexp_extract_bool(x, regular expression, n)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
包含捕获组的正则表达式。例如 |
|
n |
第n个捕获组。n为从1开始的整数。 |
返回值类型
boolean类型。
示例
-
提取字段值中的boolean值。
-
字段样例
false -
查询和分析语句(调试)
*| select regexp_extract_bool('false', '[a-zA-Z]+') -
查询和分析结果
返回一列
_col0,包含两行数据,值均为false。
-
regexp_extract_long函数
regexp_extract_long函数用于提取目标字符串中符合正则表达式的子串,并转换成bigint类型,转换失败返回null。
语法
-
提取并返回目标字符串中符合正则表达式的子串,并转换成bigint类型,转换失败返回
null。regexp_extract_long(x, regular expression) -
提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串,并转换成bigint类型,转换失败返回
null。regexp_extract_long(x, regular expression, n)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
包含捕获组的正则表达式。例如 |
|
n |
第n个捕获组。n为从1开始的整数。 |
返回值类型
bigint类型。
示例
-
提取
time字段中的数字。-
字段样例
time:19/Dec/2024:06:16:06 -
查询和分析语句(调试)
*|SELECT regexp_extract_long(time, '(\d{2})/', 1) -
查询和分析结果
返回一列
_col0,共两行,值均为19。
-
regexp_extract_double函数
regexp_extract_double函数用于提取目标字符串中符合正则表达式的子串,并转换成double类型,转换失败返回null。
语法
-
提取并返回目标字符串中符合正则表达式的子串,并转换成double类型,转换失败返回
null。regexp_extract_double(x, regular expression) -
提取目标字符串中符合正则表达式的子串,返回与目标捕获组匹配的子串,并转换成double类型,转换失败返回
null。regexp_extract_double(x, regular expression, n)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
包含捕获组的正则表达式。例如 |
|
n |
第n个捕获组。n为从1开始的整数。 |
返回值类型
double类型。
示例
-
提取
server_protocol字段中的数字。-
字段样例
server_protocol:HTTP/1.1 -
查询和分析语句(调试)
*|SELECT regexp_extract_double(server_protocol, '\d+') -
查询和分析结果
查询和分析结果返回一列
_col0,包含两行数据,值均为浮点数1.0。
-
regexp_extract_map函数
regexp_extract_map函数用于提取目标字符串中符合正则表达式中所有捕获组的子串。
语法
-
指定键信息,捕获组匹配子串作为值
regexp_extract_map(x, regular expression, keys)
-
正则包含2个捕获组,分别匹配键和值
regexp_extract_map(x, regular expression)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
包含捕获组的正则表达式。例如 |
|
keys |
捕获子串输出的key名称。参数值为array(varchar)类型,元素数目与regular expression参数的捕获组数目保持一致。 |
返回值类型
map(varchar, varchar)类型。
示例
-
示例1:提取server_protocol字段中的协议名称和版本。
-
字段样例
server_protocol: 'HTTP/2.0' -
查询和分析语句
select regexp_extract_map(server_protocol, '(\w+)/([\d\.]+)', array['name', 'version']) as protocol -
查询和分析结果
返回一条记录,protocol 列的值为
{"name":"HTTP","version":"2.0"}。
-
-
示例2:提取content字段中的所有键值对信息。
-
字段样例
content: 'verb="GET" URI="/healthz" latency="45.911µs" userAgent="kube-probe/1.30+"' -
查询和分析语句
select regexp_extract_map(content, '(\w+)="([^"]*)"') as args -
输出数据
{"latency":"45.911µs","verb":"GET","userAgent":"kube-probe/1.30+","URI":"/healthz"}
-
regexp_like函数
regexp_like函数用于判断目标字符串是否符合正则表达式。
语法
regexp_like(x, regular expression)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
正则表达式。 |
返回值类型
boolean类型。
示例
SQL
判断server_protocol字段值中是否包含数字。
-
字段样例
server_protocol:HTTP/2.0 -
查询和分析语句(调试)
*| select regexp_like(server_protocol, '\d+') -
查询和分析结果返回两行数据,值均为
true,表示 server_protocol 字段值匹配正则表达式\d+(包含数字)。
SPL
判断server_protocol字段值中是否包含数字
-
字段样例
server_protocol:HTTP/2.0
-
查询和分析语句
* |extend a = regexp_like(server_protocol, '\d+')
-
查询和分析结果
1 12-18 19:34:20 1.2.3.4
a: true
regexp_replace函数
删除或替换目标字符串中符合正则表达式的子串。
语法
-
删除目标字符串中符合正则表达式的子串,返回未被删除的子串。
regexp_replace(x, regular expression) -
替换目标字符串中符合正则表达式的子串,返回被替换后的字符串。
regexp_replace(x, regular expression, replace string)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
正则表达式。 |
|
replace string |
用于替换的子串。 |
返回值类型
varchar类型。
示例
SQL
-
示例1:将
region字段值中以cn开头的地域名都替换为中国,然后统计来自中国的请求数量。-
字段样例
region:cn-shanghai -
查询和分析语句(调试)
* | select regexp_replace(region, 'cn.*','中国') AS region, count(*) AS count GROUP BY region -
查询和分析结果:查询结果返回一行数据:region 列值为
中国,count 列值为168871。
-
-
示例2:删除
server_protocol字段值中的版本号部分,然后统计不同通信协议对应的请求数量。-
字段样例
server_protocol:HTTP/2.0 -
查询和分析语句(调试)
*| select regexp_replace(server_protocol, '.\d+') AS server_protocol, count(*) AS count GROUP BY server_protocol -
查询和分析结果返回一行数据:
server_protocol为HTTP,count为168871。
-
SPL
-
示例1:将
region字段值中以cn开头的地域名都替换为中国。-
字段样例
-
region:cn-shanghai
-
查询和分析语句
* | extend a = regexp_replace(region, 'cn.*','中国')
-
查询和分析结果
1 12-18 19:34:20 1.2.3.4 a: 中国 -
示例2:删除
server_protocol字段值中的版本号部分。-
字段样例
-
server_protocol:HTTP/2.0
-
查询和分析语句(调试)
* | extend a = regexp_replace(server_protocol, '.\d+')
-
查询和分析结果
调试结果返回一条日志条目,包含时间戳及目标 IP 地址 1.2.3.4,其中 server_protocol 字段的版本号部分已被成功删除。
regexp_split函数
regexp_split函数用于分割目标字符串,返回被分割后的子串集合。
语法
regexp_split(x, regular expression)
参数说明
|
参数 |
说明 |
|
x |
参数值为varchar类型。 |
|
regular expression |
正则表达式。 |
返回值类型
array类型。
示例
使用正斜线(/)分割request_uri字段的值。
-
字段样例
request_uri:/request/path-0/file-7 -
查询和分析语句(调试)
* | SELECT regexp_split(request_uri,'/') -
查询和分析结果为
["","request","path-0","file-7"]。