hive实现regexp_substr()

首先需要清楚regexp_substr()的作用,先看官方解释REGEXP_SUBSTR通过允许您在字符串中搜索正则表达式模式来扩展功能的功能。它也与相似REGEXP_INSTR,但是它不返回子字符串的位置,而是返回子字符串本身。如果您需要匹配字符串的内容,而不是它在源字符串中的位置,则此功能很有用。该函数返回的字符串形式为VARCHAR2或,并且CLOB数据的字符集与相同source_char。
接下来对函数中的各个参数进行说明:

REGEXP_SUBSTR(source_char, pattern, position, occurrence, match_parameter)
1.source_char:通常是用作正则处理的字符串
2.pattern:[正则表达式](https://www.runoob.com/regexp/regexp-tutorial.html)
3.position:正整数,指示source_char应该在哪里开始搜索的字符。默认值为1,表示从第一个字符开始搜索source_char。
4.occurrence:获取第几个分割出来的组。默认值为1,表示Oracle搜索的第一个匹配项pattern。
5.match_parameter:模式(‘i’不区分大小写进行检索;‘c’区分大小写进行检索。默认为’c’)针对的是正则表达式里字符大小写的匹配

再来看hive中regexp_extract()函数描述:

regexp_extract(str, regexp[, idx]) 
参数解释:
其中:
str是被解析的字符串
regexp 是正则表达式
idx是返回结果 取表达式的哪一部分 默认值为10表示把整个正则表达式对应的结果全部返回
1表示返回正则表达式中第一个() 对应的结果 以此类推
注意点:
要注意的是idx的数字不能大于表达式中()的个数。
否则报错。

通过对比oracle中的REGEXP_SUBSTR()函数不难看出,再对regexp_extract()的结果进行截取即可。
例如:

oracle中的语句是:
select REGEXP_SUBSTR('cvdfer--gth--mn','[^--]+',1,2) from dual;

在这里插入图片描述

hive改写后:
select nvl(split('cvdfer--gth--mn','--')[1],'cvdfer--gth--mn');

在这里插入图片描述

例二

提取第一个匹配的字符串
oracle中:select REGEXP_SUBSTR('cvdfer--gth--mn','[^--]+',1,1) from dual;

在这里插入图片描述

hive写法:
select regexp_extract('cvdfer--gth--mn','[^--]+',0);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42856363/article/details/109582593