我正在尝试使用regexp_extract提取以下字符串的一部分,但没有成功:
CUST_NEW_ACCOUNTS_LINES_2019-03-03.dat.gz
我只想获取日期部分。在regex101.com网站上,这似乎可行,但是蜂巢给我一个错误消息。
regexp_extract(meta_source_filename,'^(?:[^_]+_){4}([^_]+)') file_date
有人可以帮助我了解这里的错误之处吗?我对regexp_extract语法一点都不熟悉,因此一直在使用另一个函数作为起点。
谢谢!
答案 0 :(得分:1)
with your_data as (
select 'CUST_NEW_ACCOUNTS_LINES_2019-03-03.dat.gz' str
)
select regexp_extract(str,'_(\\d{4}(-\\d{2}){2})\\.',1)
from your_data;
结果:
OK
2019-03-03
Time taken: 0.062 seconds, Fetched: 1 row(s)
表达式'_(\\d{4}(-\\d{2}){2})\\.'
的意思是:
下划线_
四位数\\d{4}
重复两次(连字符和两位数)(-\\d{2}){2}
点\\.
捕获组编号1(仅日期):(\\d{4}(-\\d{2}){2})
。
在Hive中,您需要使用\\
进行屏蔽。
答案 1 :(得分:0)
您已将所需的子字符串捕获到捕获组中。您应该使用数字,组的ID作为第三个参数:
regexp_extract(meta_source_filename,'^(?:[^_]+_){4}([^_]+)', 1) file_date
^
请参阅regexp_extract(string subject, string pattern, int index)
文档:
'index'参数是Java regex Matcher group()方法的索引。有关'index'或Java regex group()方法的更多信息,请参见docs/api/java/util/regex/Matcher.html。