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

日志样例

本文基于如下日志样例介绍各个函数的查询和分析语句示例。

http_user_agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2
request_uri:/request/path-1/file-9
scheme:https
server_protocol:HTTP/2.0
region:cn-shanghai

regexp_extract_all(key, regexp)函数

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

  • 语法
    regexp_extract_all(key, regexp)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:正则表达式。
  • 示例

    提取server_protocol字段中所有的数字。

    *| SELECT regexp_extract_all(server_protocol, '\d+')
    regexp_extract_all

regexp_extract_all(key, regexp, N)函数

提取目标字段的值中符合正则表达式的子串,然后返回符合第N个捕获组中正则表达式的子串合集。返回值为Array类型。

  • 语法
    regexp_extract_all(key, regexp, N)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:包含捕获组的正则表达式。例如(\d)(\d)(\d)表示三个捕获组。
    • N:第N个捕获组。N为从1开始的整数。
  • 示例

    提取http_user_agent字段值中的Chrome部分,然后统计由Chrome浏览器发起的请求数量。

    *| SELECT regexp_extract_all(http_user_agent, '(Chrome)',1) AS Chrome, count(*) AS count GROUP BY Chrome
    regexp_extract_all

regexp_extract(key, regexp)函数

提取并返回目标字段的值中符合正则表达式的第一个子串。返回值为String类型。

  • 语法
    regexp_extract(key, regexp)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:正则表达式。
  • 示例

    提取server_protocol字段中的第一个数字。

    *|SELECT regexp_extract(server_protocol, '\d+')
    regexp_extract

regexp_extract(key, regexp, N)函数

提取目标字段的值中符合正则表达式的子串,然后返回符合第N个捕获组中正则表达式的第一个子串。返回值为String类型。

  • 语法
    regexp_extract(key, regexp, N)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:包含捕获组的正则表达式。例如(\d)(\d)(\d)表示三个捕获组。
    • N:第N个捕获组,N为从1开始的整数。
  • 示例

    提取request_uri字段值中的文件部分,然后统计各个文件的访问次数。

    * | SELECT regexp_extract(request_uri, '.*\/(file.*)', 1) AS file, count(*) AS count GROUP BY file
    分析uri

regexp_like(key, regexp)函数

判断目标字段的值是否符合正则表达式。返回值为BOOLEAN类型。

  • 语法
    regexp_like(key, regexp)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:正则表达式。
  • 示例

    判断server_protocol字段的值是否包含数字。

    *| select regexp_like(server_protocol, '\d+')
    regexp_like

regexp_replace(key, regexp, string)函数

替换目标字段的值中符合正则表达式的子串,返回被替换后的字符串。返回值为String类型。

  • 语法
    regexp_replace(key, regexp, string)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:正则表达式。
    • value:用于替换的子串。
  • 示例

    将以cn开头的地域名都替换为中国,然后统计来自中国的请求数量。

    * | select regexp_replace(region, 'cn.*','中国') AS region count(*) AS count GROUP BY region
    regexp_replace

regexp_replace(key, regexp)

删除目标字段的值中符合正则表达式的子串,返回未被删除的子串。返回值为String类型。

  • 语法
    regexp_replace(key, regexp)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:正则表达式。
  • 示例

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

    *| select regexp_replace(server_protocol, '.\d+') AS server_protocol, count(*) AS count GROUP BY server_protocol
    regexp_replace

regexp_split(key, regexp)

使用正则表达式分割目标字段的值。返回值为Array类型。

  • 语法
    regexp_split(key, regexp)
    • key:字段名称,该字段的值需为VARCHAR类型。
    • regexp:正则表达式。
  • 示例

    使用正斜线(/)分割request_uri字段的值。

    * | SELECT regexp_split(request_uri,'/')
    regexp_split