0


HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值

《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。

如何使用

regexp_extract

&

regexp_replace

函数将以上文本中所有书籍名称都提取出来?

select     substr(
                regexp_replace(
                regexp_extract(
                regexp_replace(regexp_replace('《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。','<<','《'),'>>','》'),'(.*》)',1),'.*?(《[^》|^《]+》)',',$1'),2)as books
;

代码解析:
step1:两个

regexp_replace()

依次将

<<

规整为

,将

>>

规整为


step2:

regexp_extract

正则提取满足

pattern='.*》'

时的值,此操作的主要目的为剔除最后一个书名号

后的文本内容

select     
                regexp_extract(
                regexp_replace(regexp_replace('《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。','<<','《'),'>>','》'),'(.*》)',1);

此时提取出来的结果为:

《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有《1984》

step3:

regexp_replace

将书名号前边的内容替换成

#此处的$1是指第一个小括号中的匹配结果select     
                regexp_replace('《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有《1984》','.*?(《[^》|^《]+》)',',$1');

此时提取出来的结果为:

,《平凡的世界》,《巴黎圣母院》,《1984》

此处需要注意的是:
*1).正则表达式中用了非贪婪匹配

.*?

,如果使用贪婪匹配

.*

,最终返回的结果将会是

,《1984》

*2)若省去step2的操作,提取出来的结果不满足条件

select     
                regexp_replace(
                regexp_replace(regexp_replace('《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。','<<','《'),'>>','》'),'.*?(《[^》|^《]+》)',',$1');

此时提取出来的结果为:

,《平凡的世界》,《巴黎圣母院》,《1984》也蛮好看。

step4:

substr

截取除第一个逗号之外的其余内容

select substr(',《平凡的世界》,《巴黎圣母院》,《1984》',2);

最终提取出来的结果为:

《平凡的世界》,《巴黎圣母院》,《1984》

标签: hive sql

本文转载自: https://blog.csdn.net/p1306252/article/details/133384270
版权归原作者 永远在减肥永远110的的小潘 所有, 如有侵权,请联系我们删除。

“HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值”的评论:

还没有评论