正则式函数

本文介绍正则式函数基本语法及示例。

日志服务支持如下正则式函数(正则表达式采用RE2语法)。

重要 在日志服务分析语句中,表示字符串的字符必须使用单引号('')包裹,无符号包裹或被双引号("")包裹的字符表示字段名或列名。例如:'status'表示字符串status,status"status"表示日志字段status。

函数名称

语法

说明

支持SQL

支持SPL

regexp_extract_all函数

regexp_extract_all(x, regular expression)

提取目标字符串中符合正则表达式的子串,并返回所有子串的集合。

×

regexp_extract_all(x, regular expression, n)

提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串集合。

×

regexp_extract函数

regexp_extract(x, regular expression)

提取并返回目标字符串中符合正则表达式的第一个子串。

regexp_extract(x, regular expression, n)

提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的第一个子串。

regexp_like函数

regexp_like(x, regular expression)

判断目标字符串是否符合正则表达式。

regexp_replace函数

regexp_replace(x, regular expression)

删除目标字符串中符合正则表达式的子串,返回未被删除的子串。

regexp_replace(x, regular expression, replace string)

替换目标字符串中符合正则表达式的子串,返回被替换后的字符串。

regexp_split函数

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

包含捕获组的正则表达式。例如(\d)(\d)(\d)表示三个捕获组。

n

第n个捕获组。n为从1开始的整数。

返回值类型

array类型。

示例

  • 示例1:提取server_protocol字段值中所有的数字。

    • 字段样例

      server_protocol:HTTP/2.0
    • 查询和分析语句(调试

      *| SELECT regexp_extract_all(server_protocol, '\d+')
    • 查询和分析结果regexp_extract_all

  • 示例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_all

regexp_extract函数

regexp_extract函数用于提取目标字符串中符合正则表达式的子串。

语法

  • 提取并返回目标字符串中符合正则表达式的第一个子串。

    regexp_extract(x, regular expression)
  • 提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的第一个子串。

    regexp_extract(x, regular expression, n)

参数说明

参数

说明

x

参数值为varchar类型。

regular expression

包含捕获组的正则表达式。例如(\d)(\d)(\d)表示三个捕获组。

n

第n个捕获组。n为从1开始的整数。

返回值类型

varchar类型。

示例

SQL

  • 示例1:提取server_protocol字段值中的第一个数字。

    • 字段样例

      server_protocol:HTTP/2.0
    • 查询和分析语句(调试

      *|SELECT regexp_extract(server_protocol, '\d+')
    • 查询和分析结果regexp_extract

  • 示例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
    • 查询和分析结果分析uri

  • 示例3:提取message字段值中的单引号(')和数字部分。

    • 字段样例

      message:error'1232
    • 查询和分析语句

      * | SELECT regexp_extract(message, '''\d+') 
      说明

      使用正则式函数提取字符串中的单引号(')时,需要在正则表达式中再添加一个单引号(')。

    • 查询和分析结果regexp_extract函数

SPL

  • 示例1:提取server_protocol字段值中的第一个数字。

    • 字段样例

server_protocol:HTTP/2.0
  • 查询和分析语句

* | extend a = regexp_extract(server_protocol, '\d+')
  • 查询和分析结果

image.png

  • 示例2:提取request_uri字段值中的文件部分。

    • 字段样例

request_uri:/request/path-3/file-5
  • 查询和分析语句

* | extend a = regexp_extract(request_uri, '.*\/(file.*)',1)
  • 查询和分析结果

image.png

  • 示例3:提取message字段值中的单引号(')和数字部分。

    • 字段样例

message:error'1232
  • 查询和分析语句

* | extend a = regexp_extract(message, '''\d+') 

说明

使用正则表达式函数提取字符串中的单引号(')时,需要在正则表达式中再添加一个单引号(')。

  • 查询和分析结果

image.png

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+')
  • 查询和分析结果regexp_like

SPL

判断server_protocol字段值中是否包含数字

  • 字段样例

server_protocol:HTTP/2.0
  • 查询和分析语句

* |extend a = regexp_like(server_protocol, '\d+')
  • 查询和分析结果

image.png

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
    • 查询和分析结果regexp_replace

  • 示例2:删除server_protocol字段值中的版本号部分,然后统计不同通信协议对应的请求数量。

    • 字段样例

      server_protocol:HTTP/2.0
    • 查询和分析语句(调试

      *| select regexp_replace(server_protocol, '.\d+') AS server_protocol, count(*) AS count GROUP BY server_protocol
    • 查询和分析结果regexp_replace

SPL

  • 示例1:将region字段值中以cn开头的地域名都替换为中国

    • 字段样例

region:cn-shanghai
  • 查询和分析语句

* | extend a = regexp_replace(region, 'cn.*','中国')
  • 查询和分析结果

    image.png

  • 示例2:删除server_protocol字段值中的版本号部分。

    • 字段样例

server_protocol:HTTP/2.0
  • 查询和分析语句(调试

* | extend a = regexp_replace(server_protocol, '.\d+')
  • 查询和分析结果

image.png

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,'/')
  • 查询和分析结果regexp_split