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》文章来源地址https://uudwc.com/A/gVR5M

原文地址:https://blog.csdn.net/p1306252/article/details/133384270

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年10月09日 20:47
关于操作系统与内核科普
下一篇 2023年10月09日 23:17