Hive如何提取列中同时包含至少一个字母和数字的记录
原有写法错误原因
- 第一种写法的正则
^[a-zA-Z0-9]+$要求字符串从头到尾只能是字母或数字,完全不允许特殊字符存在,同时也没有校验「同时包含字母和数字」的规则,全字母、全数字的内容也会被匹配到,完全不符合需求。 - 第二种写法的逻辑仅排除了纯数字的内容,纯字母、带特殊字符的纯字母、带特殊字符的纯数字都会被保留,比如示例中的
abc、+33都会被误判为符合条件,结果自然不对。
正确实现方案
有两种写法都可以实现需求,按需选择即可:
写法1:拆分正则条件(更易理解)
直接判断字段同时包含至少一个数字和至少一个字母即可,不需要限制其他字符:
select column_name from table_name where column_name rlike '[0-9]' and column_name rlike '[a-zA-Z]';
写法2:单正则预查(仅需一个匹配条件)
用Hive兼容的Java正则正向预查实现,和写法1效果完全一致:
select column_name from table_name where column_name rlike '^(?=.*[0-9])(?=.*[a-zA-Z]).+$';
两种写法对示例数据的过滤结果都会仅保留ab333和+ab33,完全符合要求。
内容的提问来源于stack exchange,提问作者ANAND
相关产品推荐
相关产品推荐

