【发布时间】: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字符串。 -
有效!虽然我不明白它背后的概念..你能发布一个答案并详细说明吗?