使用正则清洗hive字段中的脏数据

1 篇文章 1 订阅
1 篇文章 0 订阅

本文章如果有误请指正,而且我的正则都是自己研究+百度,如果有更好的办法,请赐教,O(∩_∩)O哈哈~

数据情况                                                          取数规则
1 英文+汉字                                                                 取出汉字
2 英文+数字+汉字                                                        取出汉字
3 英文+数字(身份证号的)                                        取出全部取出,未见到有其他英文加数字到的,如asd12344
4 数字(身份证号,手机号,客户编码)                     取出数字
5 英文                                                                           取出英文
6 汉字                                                                           取出汉字
7 特殊字符+汉字                                                          取出汉字
8 数字+汉字                                                                 取出汉字

思路
(参考文章https://blog.csdn.net/thewindkee/article/details/52785763)
不包含abc但包含admin的字符串。那么让 不包含abc的字符串出现在 admin 的两端?
^((?!abc).)*admin((?!abc).)*$
^((?![A-Za-z0-9]).)*[\\u4e00-\\u9fa5]((?![A-Za-z0-9]).)*$

表只有一个字段str1
数据                                            结果
!#@$%                  
asdw冯若丰                                冯若丰
asdw987654321冯若丰              冯若丰
33062420090606035X               33062420090606035X
16601181189                              16601181189
20194                                          20194
Judy                                            Judy
冯若丰                                         冯若丰
$@&%$@.冯若丰                       冯若丰
666冯若丰                                   冯若丰

匹配情况
返回值为true或false      选定结果为是true的
1.英文+汉字
select regexp(str1,'^((?![0-9.]).)*([\\u4e00-\\u9fa5][A-Za-z])|([A-Za-z][\\u4e00-\\u9fa5])((?![0-9.]).)*$') from sunregexp;
asdw冯若丰

2.英文+数字
select regexp(str1,'^((?![\\u4e00-\\u9fa5.]).)*([0-9][A-Za-z])|([A-Za-z][0-9])((?![\\u4e00-\\u9fa5.]).)*$') from sunregexp;
33062420090606035X

3.只包含汉字
select regexp(str1,'^((?![A-Za-z0-9.]).)*[\\u4e00-\\u9fa5]((?![A-Za-z0-9.]).)*$') from sunregexp;
冯若丰

4.只包含数字
select regexp(str1,'^((?![A-Za-z\\u4e00-\\u9fa5]).)*[0-9]((?![A-Za-z\\u4e00-\\u9fa5]).)*$') from sunregexp;
16601182089
20194

5.只包含英文
select regexp(str1,'^((?![0-9\\u4e00-\\u9fa5]).)*[A-Za-z]((?![0-9\\u4e00-\\u9fa5]).)*$') from sunregexp;
Judy

6.other case:

特殊字符+汉字

数字+汉字

英文+数字+汉字

SQL
select 
if(regexp(str1,'^((?![0-9.]).)*([\\u4e00-\\u9fa5][A-Za-z])|([A-Za-z][\\u4e00-\\u9fa5])((?![0-9.]).)*$'),regexp_replace(str1,'[[^\\u4e00-\\u9fa5]]',''),
if(regexp(str1,'^((?![\\u4e00-\\u9fa5.]).)*([0-9][A-Za-z])|([A-Za-z][0-9])((?![\\u4e00-\\u9fa5.]).)*$'),regexp_replace(str1,'[[^A-Za-z0-9]]',''),
if(regexp(str1,'^((?![A-Za-z0-9.]).)*[\\u4e00-\\u9fa5]((?![A-Za-z0-9.]).)*$'),str1,
if(regexp(str1,'^((?![A-Za-z\\u4e00-\\u9fa5]).)*[0-9]((?![A-Za-z\\u4e00-\\u9fa5]).)*$'),str1,
if(regexp(str1,'^((?![0-9\\u4e00-\\u9fa5]).)*[A-Za-z]((?![0-9\\u4e00-\\u9fa5]).)*$'),str1,
regexp_replace(str1,'[[^\\u4e00-\\u9fa5]]',''
)
)
)
)
)
)
 from sunregexp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值