我在Apache Hive中遇到了一段代码,类似于regexp_extract(input, '[0-9]*', 0),请问这段代码是做什么的?谢谢。
regexp_extract('foothebar', 'foo(.*?)(bar)', 2)
返回bar
。
index
参数是捕获组,是一个可以取以下值的整数:foothebar
1:第一个组,在我的例子中为the
2:第二个组,在我的例子中为bar
n:第n个组。如果n大于您的正则表达式中实际定义的组数,Hive查询将失败。regexp_extract(input, '[0-9]*', 0)
,您正在寻找由input
标识的列的整个匹配项,并以数字值开头。regexp_extract('9eleven', '[0-9]*', 0)
-> 返回 9
regexp_extract('9eleven', '[0-9]*', 1)
-> 查询失败regexp_extract('911test', '[0-9]*', 0)
-> 返回 911
regexp_extract('911test', '[0-9]*', 1)
-> 查询失败regexp_extract('eleven', '[0-9]*', 0)
-> 返回空字符串regexp_extract('test911', '[0-9]*', 0)
-> 返回空字符串regexp_extract('test911', '[0-9]*', 0)
确实会返回 911。 在 [0-9]*
之前,我们从未指定字符串的起始位置。select regexp_extract('test911', '[0-9]*', 0);
返回空字符串。这并不奇怪,因为regexp_extract方法基于捕获组的概念,如果没有默认为给定正则表达式的第一个子字符串匹配。这里的正则表达式示例'[0-9]*'
是零个或多个数字,并且该正则表达式在字符串的开头与零个数字匹配。有关所有细节,请查看源代码https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRegExpExtract.java。 - Uwe Mayerregexp_extract(input, '[0-9]*', 0)
将返回输入字符串中的所有起始数字。select regexp_extract('442323test41234', '[0-9]*', 0) ==> 442323
select regexp_extract('44test41234', '[0-9]*', 0) ==> 44
select regexp_extract('test41234', '[0-9]*', 0) ==> 1
但这并不是提取起始数字的最佳方式。以下格式更易读:
select regexp_extract(input, '^([0-9]+).*?$', 1)
select regexp_extract('test41234', '[0-9]*', 0)
返回空字符串而不是'1',请参见我对先前答案的评论。 - Uwe Mayer
[0-9]*
从 "55test911" 中获取 "55" 和 "911",例如regexp_extract('55test911', '[0-9]*', X)
?这应该可以使用全局标识符(例如 PHP)来完成,但如何在Hive中实现呢?我知道我可以使用另一种模式,但我想知道如何解决这个特定情况的问题 :-) - Enissay