直截了当的问题,谷歌正则表达式语法很难......
我正在阅读HortonWorks Hive教程(Hive使用与Java相同的正则表达式),以下SELECT语句使用正则表达式从可能的JSON数据中提取...
INSERT OVERWRITE TABLE batting
SELECT
regexp_extract(col_value,'^(?:([^,]*)\.?){1}',1) player_id,
regexp_extract(col_value,'^(?:([^,]*)\.?){2}',1) year,
regexp_extract(col_value,'^(?:([^,]*)\.?){9}',1) run
FROM temp_batting;
Run Code Online (Sandbox Code Playgroud)
数据如下所示:
PlayerID,yearID,stint,teamID,lgID,G,G_batting,AB,R,H,2B,3B,HR,RBI,SB,CS,BB,SO,IBB,HBP,SH,SF,GIDP,G_old aardsda01,2004 ,1,SFN,NL,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11 aardsda01,2006,1, CHN,NL,45,43,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,45 aardsda01,2007,1,CHA,AL ,25,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
所以PlayerID在column1中,year是column2,R(运行)是第9列.Regexp_extract如何成功提取这些数据?
我是非捕获组的新手,但在我看来,整个事情都是非捕获组.此外,我习惯于以[0-9] {9}的形式看到{1},{2}或{9},这意味着它与9位数字匹配.在这种情况下,看起来它指向第9个匹配的东西,这个语法叫什么?
首先打破正则表达式:
^(?:([^,]*)\.?){n}
Run Code Online (Sandbox Code Playgroud)
^ 是一个开始 String(?:...){n}是一个非捕获组重复n次数([^,]*)是一个否定的字符类,它匹配"不,"零次或多次\.? 是一个可选的(字面) .那么,这是如何工作的?
非捕获组仅用于数字量词,即它使组中的整个模式重复n次数.
捕获的实际模式位于捕获组中([^,]*).我不确定为什么有可选项.,我没有看到任何输入以.你的样本数据结尾,但我认为有一些.
发生的事情是该组被捕获的n次数,但只存储了最后一次捕获,并且存储在第一组中,即组1中.这是默认值regexp_extract.
因此,当模式在第一种情况下重复一次时,我们捕获逗号分隔数组上的第一个元素.当模式在第二个例子中重复两次时,我们捕获第二个元素.当模式重复九次时,则捕获第九个元素.
模式本身实际上非常可怕,因为它允许重复零长度模式,这意味着如果存在不匹配的模式,正则表达式引擎可以回溯很多.我想这对你来说不是问题,但通常是不好的做法.
最好是[^,]*通过添加+:
^(?:([^,]*+)\.?){n}
Run Code Online (Sandbox Code Playgroud)
或者使整个非捕获组成为原子:
^(?>([^,]*)\.?){n}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7371 次 |
| 最近记录: |