Hive split字符串取除末项内容时点号分割方案失效原因咨询
失效原因
- 正则元字符未转义:
.是正则语法中的特殊元字符,默认匹配除换行符外的任意单个字符,你直接将分隔符替换为.写入正则时,它不会匹配字面值的点号,而是匹配任意字符,直接导致匹配逻辑完全不符合预期。如果要匹配字面量点号,需要加转义符处理。 - 原正则逻辑本身存在缺陷:你当前使用的
^(.*?)(?:,)(.*)$用了非贪婪匹配.*?,只会匹配到第一个分隔符的位置,取分组2得到的是第一个分隔符之后的所有内容,根本不是「去掉最后一项」的结果,你之前用逗号时的运行正确只是巧合,本身逻辑不满足需求。
正确实现方案
要实现「删除最后一个分隔符及之后的内容,保留前面所有部分」,应该用贪婪匹配规则实现:
- 逗号作为分隔符的写法:
select regexp_extract('test,data,fd,dfd','^(.*),.*$', 1) from tablename;
执行后返回结果为test,data,fd,符合需求。
2. 点号作为分隔符的写法,注意要对.做双重转义(Hive字符串中\本身需要转义):
select regexp_extract('193.54.23.456','^(.*)\\..*$', 1) from tablename;
执行后返回预期结果193.54.23。
内容的提问来源于stack exchange,提问作者INAM
相关产品推荐
相关产品推荐

