hive:正则函数

1.regexp

语法: A REGEXP B 
操作类型: strings 
描述: 功能与RLIKE相同

--匹配2开头,后接9个数字
  select * from dws.dws_resumeachieve_t_result_last where workno  regexp '2\\d{9}';
  select * from dws.dws_resumeachieve_t_result_last where workno  rlike '2\\d{8}';
--非匹配2开头,后接9个数字
select * from dws.dws_resumeachieve_t_result_last where workno  not regexp '2\\d{9}';
select * from dws.dws_resumeachieve_t_result_last where workno not rlike '2\\d{8}';

2.regexp_extract

语法: regexp_extract(string str , string regexp, int index) 
返回值: string 
说明:将字符串str 按照regexp正则表达式的规则拆分,返回index指定的字符。

其中:

str是被解析的字符串或字段名

regexp 是正则表达式

idx是返回结果 取表达式的哪一部分  默认值为1。

0表示把整个正则表达式对应的结果全部返回

1表示返回正则表达式中第一个() 对应的结果 以此类推 

select regexp_extract('IloveYou','I(.*?)(You)',1); --返回:love

select regexp_extract('IloveYou','I(.*?)(You)',2);--返回:You

select regexp_extract('IloveYou','(I)(.*?)(You)',1);--返回:I

select regexp_extract('IloveYou','(I)(.*?)(You)',0);--返回:IloveYou

select regexp_replace("IloveYou","You","");--返回:Ilove

3.regexp_replace

语法: regexp_replace(string A, string B, string C) 
返回值: string 
说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
 

select regexp_replace("IloveYou","You","");--返回:Ilove
select regexp_replace("IloveYou","You","lili");--返回:Ilovelili

参考:

 https://blog.csdn.net/bitcarmanlee/article/details/51106726

 

案例:

正则匹配手机号:

select regexp('a12312312qweqwe1231','^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$');
返回:
false
select regexp('16619972058','^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$');
返回:
true

匹配2开头,后接9个数字:

select * from dws.dws_resumeachieve_t_result_last where workno  regexp '2\\d{9}'-

 

案例:

匹配字符串(字段)中某段特殊值:

select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',0) 
返回:
itde
select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',1)
返回:
i
select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',2)
返回:
td
select regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',2)
abc

 --匹配最后一个竖线后边内容
select regexp_extract('888|666|544','.*\\|(.*)',1);
返回:
544

 --匹配最后一个竖线前边内容
select regexp_extract('888|666|544','(.*)\\|.*',1);
返回:
888|666
select regexp_extract('888|666|544|543','(.*)\\|.*',1);
返回:
888|666|544


其他测试:
select regexp_extract('888|666|544','.*\\|(.*)',0);
返回:
888|666|544


select regexp_extract('888|666|544','(.*)\\|.*',0);
返回:
888|666|544
select regexp_extract('888|666|544|543','(.*)\\|.*',0);
返回:
888|666|544|543

 

 

案例1: 

select regexp('12312312qweqwe1231','^([\\d])');  --数字开头
返回:
true


select regexp('12312312qweqwe1231','([\\d])$'); -- 数字结尾
返回:
true

select regexp('1231231212,31AD','^[0-9A-F]+$');  -- 16进制
返回:
false


select regexp_extract('https://xxxx.xxx.xxx/xxx/index.html#/?communityId=89231231231&timeinteval=1517215002.287322','communityId=(.*?)&',1);  --url中解析出特定编号
返回:
89231231231

 

案例2: 

select
regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',0),  -- x=18abc
regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','^x=([a-z]+)([0-9]+)',0), -- x=a3

regexp_extract('https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive','id=([0-9]+)',0),    -- id=522228774076
regexp_extract('https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive','id=([0-9]+)',1),    -- 522228774076

regexp_extract('http://a.m.taobao.com/i41915173660.htm','i([0-9]+)',0),            -- i41915173660
regexp_extract('http://a.m.taobao.com/i41915173660.htm','i([0-9]+)',1)             -- 41915173660

 

regexp_replace函数:

举例1:

select *,regexp_replace(a,'公司','gongsi') t from  tmp.csv_t1

select *,regexp_replace(a,'公司|有限','gongsi') t from  tmp.csv_t1

 

举例2:

select regexp_replace('foobar', 'oo|ar', ''); --返回值为fb

举例3:

可替换字符串中的字符为其他指定字符,也可置换为空

  select ChargeName, regexp_replace(regexp_replace(sub, '\\{', ''), '\\}', '') managebranch,StartDate from (select * from ods_aimsen_base_regionhistories lateral view explode(split(ManageBranchNos,'\\}\\{')) tmp as sub) tmp_a

例:

select regexp_replace("叶小仙儿?", "?", "") filed;
返回:
叶小仙儿

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值