直截了当的问题,谷歌正则表达式语法很难......
我正在浏览HortonWorks Hive tutorials(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;
数据如下所示:
PlayerID,yearID,进站,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,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个匹配的东西,这个语法叫什么?
答案 0 :(得分:5)
首先打破正则表达式:
^(?:([^,]*)\.?){n}
^
是String
(?:...){n}
是一个重复n
次([^,]*)
是一个否定的字符类,它匹配“not ,
”零次或多次\.?
是可选的(文字).
那么,这是如何工作的?
非捕获组仅用于numeric quantifier,即它使组中的整个模式重复n
次。
捕获的实际模式位于捕获组([^,]*)
中。我不确定为什么可选的.
存在,我在示例数据中看不到任何以.
结尾的输入,但我认为有一些。
该组被捕获n
次,但只存储了最后一次捕获,并存储在第一组中,即组1.这是regexp_extract
中的默认值。 / p>
因此,当模式在第一种情况下重复一次时,我们捕获逗号分隔数组上的第一个元素。当模式在第二个例子中重复两次时,我们捕获第二个元素。当模式重复九次,然后捕获第九个元素。
模式本身实际上非常可怕,因为它允许重复零长度模式,这意味着如果存在不匹配的模式,正则表达式引擎可以回溯很多。我想这对你来说不是问题,但通常是不好的做法。
最好通过添加[^,]*
来提升+
占有率:
^(?:([^,]*+)\.?){n}
或者使整个非捕获组成为原子:
^(?>([^,]*)\.?){n}
答案 1 :(得分:0)
我认为练习和学习正则表达式的好方法是在这个网站上:http://www.regexr.com/
只需在此处粘贴表达式,然后删除/替换部分表达式。这一切都比试图通过视觉破译正则表达式更有意义。
答案 2 :(得分:0)
在不使用正则表达式的情况下执行此操作的另一种方法是使用拆分函数
interface ISumanEvent extends String {
explanation: string,
toString: TSumanToString,
[key: string]: string|TSumanToString|ISumanEvent;
}