使用REGEXP_EXTRACT不会产生预期的结果 - Hive

时间:2018-01-09 20:06:50

标签: regex hadoop hive

我正在尝试在Hive中使用REGEXP_EXTRACT函数从列中获取所需的字符串。列中的数据采用以下形式:

words\more_words

我需要在\之后提取字符串的一部分。我尝试过这样的事情:

SELECT REGEXP_EXTRACT('words\more_words','(.*)(\\+)(.*)',3) -> returns nothing

SELECT REGEXP_EXTRACT('words\more_words','.*(\\+)(.*)',2) -> returns nothing

SELECT REGEXP_EXTRACT('words\more_words','\w+(\\+)(\w+)',2)-> returns nothing

SELECT REGEXP_EXTRACT('words\more_words','\\+(\w+)',1) -> returns nothing

我已验证所有上述正则表达式与words\more_words上的regex101.com匹配(除了匹配\more_words的最后一个正则表达式)。但是,我完全不知道为什么蜂巢没有给出理想的结果。

我不确定我做错了什么。所以,为了验证,我这样做了:

SELECT REGEXP_EXTRACT('words\more_words','.*\\.*',0) -> returns 'wordsmore_words'

不确定为什么\已从结果中删除。从技术上讲,正则表达式应匹配整个字符串,结果应该是整个字符串,对吗?

如何在\之后提取字符串的一部分?任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

使用'\\'定义单个文字反斜杠。也就是说,如果字符串包含\,则应在字符串文字'\\'中使用两个反斜杠。

在正则表达式中,双字面反斜杠可用于匹配文字反斜杠。字符串模式\\应写为'\\\\',以匹配单个文字backsalsh。

使用

SELECT REGEXP_EXTRACT('words\\more_words','.*\\\\+(.*)',1)

请注意,'words\\more_words'是一个字符串文字,用于定义words\more_words文字字符串。

模式详情

  • .* - 除了换行符之外的任何0 +字符,尽可能多
  • \\\\+ - 一个或多个文字\字符
  • (.*) - 捕获组#1:除了换行符之外的任何0+字符,尽可能多(在最后1参数的帮助下返回{{1}功能)。