《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<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》
版权归原作者 永远在减肥永远110的的小潘 所有, 如有侵权,请联系我们删除。