REGEXP_REPLACE

source字符串中第occurrence次匹配pattern的子串替换成指定字符串replace_string后返回结果字符串。

注意事项

REGEXP_REPLACE函数在Hive兼容的数据类型版本中遵循Java regex规范。而在1.0和2.0数据类型版本中,则遵循MaxCompute的规范。

命令格式

string regexp_replace(string <source>, string <pattern>, string <replace_string>[, bigint <occurrence>])

参数说明

  • source:必填。STRING类型,待替换的字符串。

  • pattern:必填。STRING类型常量或正则表达式。待匹配的模型。更多正则表达式编写规范,请参见正则表达式规范pattern为空串时返回报错。

  • replace_string:必填。STRING类型,将匹配pattern的字符串替换后的字符串。

    说明
    • 如果replace_string为空字符串函数将删除匹配pattern的字符串后返回。

    • replace_string中可以包含后向引用\n,表示插入与pattern中第n个捕获组匹配的子字符串,其中n的取值范围为1~9,\0表示整个pattern。在使用时需要对反斜线进行转义:\\1,或者使用原始字符串(Raw String):R'(\1)'。

  • occurrence:可选。BIGINT类型常量,必须大于等于0,表示将第occurrence次匹配的字符串替换为replace_string,为0时表示替换所有匹配的子串。为其他类型或小于0时,返回报错。默认值为0。

返回值说明

返回STRING类型。返回规则如下:

  • 当引用不存在的组时,其结果未定义。

  • 如果replace_string值为NULL且pattern有匹配,返回NULL。

  • 如果replace_string值为NULL但pattern不匹配,返回原字符串。

  • sourcepatternoccurrence值为NULL时,返回NULL。

使用示例

  • 示例1:将字符串按照指定规则进行替换。命令示例如下:

    --返回Abcd。
    select regexp_replace("abcd", "a", "A", 0);
    --返回bcd。
    select regexp_replace("abcd", "a", "", 0);
    --返回19700101。
    select regexp_replace("1970-01-01", "-", "", 0);
    --返回abc。
    select regexp_replace("a1b2c3", "[0-9]", "", 0);
    --返回a1b2c。
    select regexp_replace("a1b2c3", "[0-9]", "", 3);
  • 示例2:将123.456.7890字符串中与([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})匹配的所有字符串替换为(\\1)\\2-\\3。命令示例如下。

    --返回(123)456-7890。
    select regexp_replace('123.456.7890', '([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})',
    '(\\1)\\2-\\3', 0);
  • 示例3:将abcd字符串中与指定规则匹配的字符串进行替换。命令示例如下。

    --返回a b c d 。
    select regexp_replace('abcd', '(.)', '\\1 ', 0);
    --返回a bcd。
    select regexp_replace('abcd', '(.)', '\\1 ', 1);
    --返回d。
    select regexp_replace("abcd", "(.*)(.)$", "\\2", 0);
  • 示例4:假设表url_set中列名为URL的数据格式为www.simple@xxx.com,且每行的xxx完全不同,现需要将列中www后的所有内容都替换掉。命令示例如下。

    --返回结果为wwwtest。
    select regexp_replace(url,'(www)(.*)','wwwtest',0) from url_set;
  • 示例5:任一输入参数为NULL。命令示例如下。

    --返回NULL。
    select regexp_replace('abcd', '(.)', null, 0);
  • 示例6:引用不存在的组。命令示例如下。

    --因为pattern中只定义了一个组,引用的第二个组不存在。
    --请避免这样使用,引用不存在的组的结果未定义。
    regexp_replace("abcd", "(.)", "\\2", 0) = "" 或 "abcd"
    --因为在pattern中没有组的定义,所以\1引用了不存在的组,
    --请避免这样使用,引用不存在的组的结果未定义。
    regexp_replace("abcd", "a", "\\1", 0) = "bcd" 或 "abcd"

相关函数

REGEXP_REPLACE函数属于字符串函数,更多查找字符串、转换字符串格式的相关函数请参见字符串函数