gpt4 book ai didi

Java/Hive 正则表达式解释

转载 作者:行者123 更新时间:2023-11-30 06:21:17 24 4
gpt4 key购买 nike

直截了当的问题,谷歌正则表达式语法很难...

我正在浏览 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,stint,teamID,lgID,G,G_batting,AB,R,H,2B,3B,HR,RBI,SB,CS,BB,SO,IBB,HBP,SH,SF,GIDP,G_oldaardsda01,2004,1,SFN,NL,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11aardsda01,2006,1,CHN,NL,45,43,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,45aardsda01,2007,1,CHA,AL,25,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2

因此 PlayerID 在第 1 列,年份在第 2 列,R(运行)在第 9 列。regexp_extract 如何成功提取此数据?

我是非捕获组的新手,但在我看来整个事物都是非捕获组。此外,我习惯于以 [0-9]{9} 形式看到 {1}、{2} 或 {9},这意味着它与 9 位数字相匹配。在这种情况下,它看起来像是指向某个东西的第 9 个匹配项,这个语法叫什么?

最佳答案

首先分解正则表达式:

^(?:([^,]*)\.?){n}
  • ^String
  • 的开始
  • (?:...){n} 是一个非捕获组,重复 n
  • ([^,]*)是一个否定字符类,它匹配“not ,”零次或多次
  • \.? 是可选的(文字)

那么,这是如何工作的?

非捕获组仅用于 numeric quantifier ,即它使组中的整个模式重复 n 次。

被捕获的实际模式在捕获组 ([^,]*) 中。我不确定为什么可选的 . 在那里,我没有看到任何以 . 结尾的输入在你的样本数据中,但我假设有一些。

发生的情况是该组被捕获 n 次,但仅存储最后一次捕获,并将其存储在第一组中,即组 1。这是 regexp_extract 中的默认设置

因此,当模式在第一种情况下重复一次时,我们捕获逗号分隔数组中的第一个元素。当模式在第二个示例中重复两次时,我们捕获第二个元素。当模式重复九次时,将捕获第九个元素。

模式本身实际上非常可怕,因为它允许重复零长度模式,这意味着如果存在不匹配的模式,正则表达式引擎可以回溯很多。我想这对您来说不是问题,但这通常是不好的做法。

最好通过添加 + 使 [^,]* 具有所有格:

^(?:([^,]*+)\.?){n}

或者使整个非捕获组原子化:

^(?>([^,]*)\.?){n}

关于Java/Hive 正则表达式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20724960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com