REGEXP_SUBSTR

功能概述

返回字符串中与正则表达式匹配的子串,可以指定从第几个字符开始搜索、取第几次匹配。没有匹配时返回 NULL。

和 REGEXP_EXTRACT 的区别:

REGEXP_EXTRACT
REGEXP_EXTRACT
按分组(group)提取,适合从固定格式中取某一段;
REGEXP_SUBSTR
REGEXP_SUBSTR
总是返回整个匹配,并支持按出现次数取第 N 个匹配,适合从文本中依次取出多个同类片段(如第 2 个数字)。需要一次取出全部匹配时用 REGEXP_EXTRACT_ALL。

语法

REGEXP_SUBSTR(<str>, <pattern> [, <position> [, <occurrence>]])

参数说明

  • <str>
    <str>
    :STRING 类型,被搜索的字符串。

  • <pattern>
    <pattern>
    :STRING 类型,正则表达式。为空字符串时返回 NULL。正则语法见正则表达式。

  • <position>
    <position>
    :可选,BIGINT 类型,从第几个字符开始搜索,默认为 1。按字符计数,超过字符串长度时返回 NULL。

  • <occurrence>
    <occurrence>
    :可选,BIGINT 类型,返回第几次匹配,默认为 1。匹配次数不足时返回 NULL。

任一参数为 NULL 时返回 NULL。

使用示例

取第一个、第二个数字,以及从第 10 个字符开始的第一个数字:

SELECT regexp_substr('order-123-item-456', '\\d+') AS first_num, regexp_substr('order-123-item-456', '\\d+', 1, 2) AS second_num, regexp_substr('order-123-item-456', '\\d+', 10) AS from_pos_10, regexp_substr('order-123-item-456', '\\d+', 1, 3) AS third_num;

first_numsecond_numfrom_pos_10third_num
123456456NULL
  • from_pos_10
    from_pos_10
    :第 10 个字符是
    -item-456
    -item-456
    的
    -
    -
    ,之后的第一个数字是
    456
    456
    。
  • third_num
    third_num
    :字符串中只有两段数字,第 3 次匹配不存在,返回 NULL。

从日志中提取 IP 地址:

SELECT log, regexp_substr(log, '\\d+\\.\\d+\\.\\d+\\.\\d+') AS ip FROM VALUES ('login ok from 10.0.0.12 at 08:00'), ('login failed from 192.168.1.7'), ('no ip here') AS t(log);

logip
login ok from 10.0.0.12 at 08:0010.0.0.12
login failed from 192.168.1.7192.168.1.7
no ip hereNULL

注意事项

  • 返回整个匹配内容,正则中的分组不影响结果。需要按分组提取时用
    REGEXP_EXTRACT
    REGEXP_EXTRACT
    。
  • 匹配到空串时返回 NULL。
  • SQL 字符串中的反斜杠需要转义,
    \d
    \d
    写作
    '\\d'
    '\\d'
    。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询