《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。
如何使用regexp_extract
®exp_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》