我有一个固定长度的字符串,我需要将部分提取为字段。 ACCOUNT1的前5个字符,ACCOUNT2的后2个字符,依此类推。
我想使用regexp_extract
(不是子字符串),但我忽略了这一点。他们没有任何回报。
select regexp_extract('47t7916A2088M040323','(.*){0,5}',1) as ACCOUNT1,
regexp_extract('47t7916A2088M040323','(.*){6,8}',1) as ACCOUNT2 --and so on
答案 0 :(得分:1)
如果你想使用正则表达式,那么就像在这个例子中一样使用它。对于Account1表达式'^(.{5})'
表示:^
是字符串的开头,然后捕获由任意5个字符组成的组1(组在圆括号中)。 {5}
- 是量词,意味着5次。对于Account2 - 捕获组2在group1之后。 (.{2})
- 表示两个任意字符。
在第二个正则表达式的这个例子中,有两组(第一列和第二列),我们提取第二组。
hive> select regexp_extract('47t7916A2088M040323','^(.{5})',1) as Account1,
> regexp_extract('47t7916A2088M040323','^(.{5})(.{2})',2) as Account2;
OK
47t79 16
Time taken: 0.064 seconds, Fetched: 1 row(s)
实际上,您可以为所有列使用相同的正则表达式包含组,从而提取不同的捕获组 使用相同正则表达式并提取不同组的示例:
hive> select regexp_extract('47t7916A2088M040323','^(.{5})(.{2})',1) as Account1,
> regexp_extract('47t7916A2088M040323','^(.{5})(.{2})',2) as Account2
> ;
OK
47t79 16
Time taken: 1.043 seconds, Fetched: 1 row(s)
为每列添加更多组。此方法仅适用于固定长度的列。如果要解析分隔的字符串,则在组之间放置分隔符,修改组以匹配除分隔符以外的所有内容并删除/修改量词。对于这样的示例,子字符串或分割用于分隔字符串看起来更简单和更清晰,regexp允许解析非常复杂的模式。希望你能抓住这个主意。