Impala正则表达式:查找带特定分隔符的目标字符序列
Impala正则匹配解决方案
需求回顾
需要匹配字符串中符合以下规则的序列:
- 以
~FC*开头 - 后续包含11个
*(*之间可包含任意字母/数字,也可为空) - 第12个
*后紧跟Y~
问题分析
你之前的正则(~FC\\*).*(\\*Y~)存在三个问题:
.*是贪婪匹配,会覆盖多个目标序列,无法精准定位单个符合规则的片段- 未限制
*的数量,无法保证刚好包含11个后续分隔符 - 仅提取了第一个分组
~FC*,而非整个匹配序列
解决方案
1. 提取第一个匹配项
使用regexp_extract,指定第三个参数为0(返回整个匹配内容),搭配精准正则:
select regexp_extract(col_name, '~FC\\*(?:[^*]*\\*){11}Y~', 0) as pattern_found from db.table where id = 123456789 limit 1
执行后会返回第一个符合规则的完整序列:~FC*C*IND*30*MC*blah blah fjdgfeufh*27*0*****Y~
2. 提取所有匹配项(Impala 2.5+支持)
如果需要提取所有符合规则的序列,使用regexp_extract_all函数,返回匹配结果数组:
select regexp_extract_all(col_name, '~FC\\*(?:[^*]*\\*){11}Y~', 0) as all_patterns from db.table where id = 123456789 limit 1
执行后会返回包含两个匹配项的数组:["~FC*C*IND*30*MC*blah blah fjdgfeufh*27*0*****Y~", "~FC*Z*IND*39*MC*jhlkfhfudfgsdkufgkusgfn*23*0*****Y~"]
正则说明
~FC\\*:匹配起始的~FC*,SQL中用\\*转义正则元字符*(?:[^*]*\\*){11}:非捕获组,重复11次「任意非*字符(可空)+*」,确保后续刚好有11个分隔符*Y~:匹配第12个*后紧跟的Y~,严格符合规则
内容的提问来源于stack exchange,提问作者e.net
相关产品推荐
相关产品推荐

