如何在Hive中提取分隔符第2次出现前的内容?
解决正则提取
KRW3TR.899877的问题 我来帮你搞定这个正则提取的需求!先分析下你之前的正则为什么没成功,再给你几个可行的方案:
问题分析
你之前用的REGEXP_EXTRACT(acolumn,'^([^\.]+)\.?',2)有两个关键问题:
^([^\.]+)只会匹配第一个点之前的所有非点字符,也就是KRW3TR,完全没包含后面的.899877;- 函数第三个参数指定取第2个捕获组,但你的正则里只有1个捕获组,传
2自然会返回空值。
你的目标是提取字符串中前两个由点分隔的片段(KRW3TR和899877),也就是到第二个点之前的完整内容,下面是几种实用的实现方法:
方法1:使用REGEXP_EXTRACT直接匹配目标内容
调整正则表达式,精准匹配开头的「非点字符+点+非点字符」组合:
REGEXP_EXTRACT(acolumn, '^([^\\.]+\\.[^\\.]+)')
^:锚定字符串开头,确保从最开始匹配[^\\.]+:匹配一串非点字符(SQL环境中需要用\\转义.,部分工具可能只需要单个\)\\.:匹配一个真实的点- 整个捕获组
([^\\.]+\\.[^\\.]+)会直接命中你要的KRW3TR.899877
方法2:使用REGEXP_REPLACE剔除后续冗余内容
如果你更习惯用替换思路,可以把目标部分之后的所有内容替换为空:
REGEXP_REPLACE(acolumn, '^([^\\.]+\\.[^\\.]+)\\..*', '\\1')
\\..*:匹配第二个点以及之后的所有内容'\\1':将匹配到的整段内容替换为第一个捕获组(也就是我们要保留的目标内容)
方法3:结合TRIM处理潜在空格(可选)
如果你的字符串前后可能存在多余空格,可以在提取后用TRIM做清理:
TRIM(REGEXP_EXTRACT(acolumn, '^([^\\.]+\\.[^\\.]+)'))
用你的示例字符串KRW3TR.899877.GR0054656*DR.798012...2..............GR0054656*EUR*测试,上面三种方法都能精准得到你想要的KRW3TR.899877结果。
内容的提问来源于stack exchange,提问作者thecardcaptor
相关产品推荐
相关产品推荐

