我正在尝试在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'
不确定为什么\
已从结果中删除。从技术上讲,正则表达式应匹配整个字符串,结果应该是整个字符串,对吗?
如何在\
之后提取字符串的一部分?任何帮助,将不胜感激。谢谢!
答案 0 :(得分:2)
使用'\\'
定义单个文字反斜杠。也就是说,如果字符串包含\
,则应在字符串文字'\\'
中使用两个反斜杠。
在正则表达式中,双字面反斜杠可用于匹配文字反斜杠。字符串模式\\
应写为'\\\\'
,以匹配单个文字backsalsh。
使用
SELECT REGEXP_EXTRACT('words\\more_words','.*\\\\+(.*)',1)
请注意,'words\\more_words'
是一个字符串文字,用于定义words\more_words
文字字符串。
模式详情
.*
- 除了换行符之外的任何0 +字符,尽可能多\\\\+
- 一个或多个文字\
字符(.*)
- 捕获组#1:除了换行符之外的任何0+字符,尽可能多(在最后1
参数的帮助下返回{{1}功能)。