hive中的regexp_extract的用法总结

1.关于正则表达式的符号及意义

正则表达式由标准的元字符(metacharacters)所构成:

/做为转义,即通常在“/”后面的字符不按原来意义解释,如/b/匹配字符“b”,当b前面加了反斜杠后//b/,转义为匹配一个单词的边界。-或-对正则表达式功能字符的还原,如““匹配它前面元字符0次或多次,/a/将匹配a,aa,aaa,加了"/"后,/a//将只匹配”a“。
^匹配一个输入或一行的开头 ,/^a/匹配”an A“,而不匹配”An a“
$匹配一个输入或一行的结尾,/a$/匹配”An a“,而不匹配”an A“
*匹配前面原字符0次或多次,/ba*/将匹配b,ba,baa
+匹配前面元字符1次或多次,/ba*/将匹配ba,ba,baaa
?匹配前面元字符0次或1次,/ba?/将匹配b,ba
(x)匹配x保存x在名为$1…$9的变量中
{n}精确匹配n次
{n,}匹配n次以上
{n,m}匹配n-m次
[xyz]字符集(character set),匹配这个集合中任一一个字符(或元字符)
[^xyz]不匹配这个集合中的任何一个字符
[/b]匹配一个退格符
/b匹配一个单词的边界
/B匹配一个单词的非边界
/d匹配一个数字字符,//d/=/[0-9]/
/D匹配一个非数字字符,//D/=/[^0-9]/
/n匹配一个换行符
/r匹配一个换行符
/S匹配一个空白字符,包括/n,/r,/f,/t,/v等
/w匹配一个可以组成单词的字符,包括下划线,如[/w]匹配”$5.98“中的5,等于[a-zA-Z0-9]
/W匹配一个不可以组成单词的字符,如[/W]匹配”5.98“中的$,等于[^a-zA-Z0-9]

‘( )’ 标记一个子表达式的开始和结束的位置。
'[]'标记一个中括号表达式。
/num匹配num,其中num是一个正整数。对锁获取的匹配的引用。

2.regexp_extract函数

regexp_extract(str,regexp[,idx)
字符串正则表达式解析函数。

参数解释:

其中:
str 是被解析的字符串或字段名。
regexp 是正则表达式。
idx 是返回结果 取表达式的哪一部分 默认值是1。
0 是表示把整个表达式对应的结果全部返回
1 表示返回正则表达式中第一个()对应的结果 依次类推

注意事项:

idx的数字不能大于表达式中()的个数,否则会报错。

实例:

select regexp_extract('hitdescisiondlist','(i)(.*?)(e)',0);

得到结果:
itde
过程分析:
(i)表示匹配到字符i开始
(.?) (e) 为非贪婪模式 ,就是匹配尽可能少的字符。在这里匹配到任意的字符直到匹配到字符e结束。倘若有n个e并列,仅仅会渠道首个。
如果表达式为(.
)(e)为贪婪模式,假如有n个e并列,则会匹配到这n个e。
2)

select regexp_extract('hitdescisiondlist','(i)(.*?)(e)',1);

得到结果:
i
返回完整结果中的第一个()中的元素。
3)

select regexp_extract('hitdescisiondlist','(i)(.*?)(e)',2);

得到结果:td
返回第二个括号中对应的元素。
4)

select regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',2)

得到结果:abc
此时,当前的语句只有2个()表达式分别为([0-9]+)表示匹配到的数字出现1次或多次以及([a-z])表示匹配到的字母出现1次或多次。
如果,当都idx>=3时,就会报错。

FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments '3': org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public java.lang.String org.apache.hadoop.hive.ql.udf.UDFRegExpExtract.evaluate(java.lang.String,java.lang.String,java.lang.Integer) with arguments {x=a3&x=18abc&x=2&y=3&x=4,x=([0-9]+)([a-z]+),3}:No group 3
  • 11
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值