我对正则表达式很陌生,我需要在Impala中搜索一个字符串字段,以找到与这个确切的字符序列匹配的多个字符:~FC*,后面是另外11个*,它们之间可能有字母/数字(但不能,它们基本上是这个字符串字段中的分隔符)。在第12 *之后(如果在~FC*中计算#1 ),它应该紧跟在Y~后面。
因为星号不是字母或数字,所以我不确定如何正确地搜索这些分隔符。
到目前为止这是我的SQL:
select
regexp_extract(col_name, '(~FC\\*).*(\\*Y~)', 1) as "pattern_found"
from db.table
where id = 123456789
limit 1返回的数据:
pattern_found
--------------
~FC*(~FC\\*)在Impala SQL中,它返回~FC*,这很好(从我的另一个问题获得)
一直在尝试这个(~FC\\*).*(\\*Y~),它显然没有计算星号的数量,但它也没有选择Y。
这是一个测试字符串,它有2次出现:
N4*CITY*STATE*2155446*2120~FC*C*IND*30*MC*blah blah fjdgfeufh*27*0*****Y~FC*Z*IND*39*MC*jhlkfhfudfgsdkufgkusgfn*23*0*****Y~结果应该是这2,其中有一个重叠的~之间。但如果两者都找不到的话,至少会有第一次被发现。
~FC*C*IND*30*MC*blah blah fjdgfeufh*27*0*****Y~ ~FC*Z*IND*39*MC*jhlkfhfudfgsdkufgkusgfn*23*0*****Y~
发布于 2022-09-27 19:59:43
想出了一个解决办法,但很高兴知道一个更好的方法来完成这个任务。
这就是Impala SQL中的工作原理,所有星号都需要括号和双转义反斜杠:
(~FC\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*Y)完整SQL:
select
regexp_extract(col_name, '(~FC\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*[^\\*]*\\*Y)', 1) as "pattern_found"
from db.table
where id = 123456789
limit 1下面是没有Impala SQL所需的额外语法的RegexDemo
https://stackoverflow.com/questions/73871897
复制相似问题