将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不匹配,返回原字符串。
source、pattern或occurrence值为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函数属于字符串函数,更多查找字符串、转换字符串格式的相关函数请参见字符串函数。