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;
返回:
叶小仙儿