【问题标题】:Using REGEXP_EXTRACT doesn't give the expected result - Hive使用 REGEXP_EXTRACT 不会给出预期的结果 - Hive
【发布时间】:2018-01-09 20:06:50
【问题描述】:

我正在尝试在 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

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

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

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

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

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

【问题讨论】:

  • 单个文字反斜杠用'\\' 定义。在正则表达式中,双文字反斜杠可用于匹配文字反斜杠。所以,试试SELECT REGEXP_EXTRACT('words\\more_words','.*\\\\+(.*)',1)。请注意,'words\\more_words' 定义了一个 words\more_words 字符串。
  • 有效!虽然我不明白它背后的概念..你能发布一个答案并详细说明吗?

标签: regex hadoop hive


【解决方案1】:

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

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

使用

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

请注意,'words\\more_words' 是定义 words\more_words 文字字符串的字符串文字。

模式详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多