4

我在 Apache Hive 中遇到了一段代码,例如 regexp_extract(input, '[0-9]*', 0),有人可以向我解释一下这段代码的作用吗?谢谢

4

3 回答 3

21

Hive 手册 DDL中,它返回使用模式提取的字符串。例如regexp_extract('foothebar', 'foo(.*?)(bar)', 2)返回bar

index参数是捕获组,它是一个整数,可以取以下值:

  • 0:整个比赛,在我的例子中是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)-> 返回空字符串
于 2013-01-17T03:41:59.917 回答
3

上面的答案部分不正确。regexp_extract('test911', '[0-9]*', 0)肯定会返回 911。我们之前从未指定字符串的开头[0-9]*

于 2013-07-01T18:02:06.067 回答
-1

正则表达式regexp_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)

上面的正则表达式说,列出字符串中开始的所有数字并忽略其余数字。

于 2019-10-24T06:27:29.380 回答