Oracle REGEXP_SUBSTR如何捕获正则匹配结果中的最后一个分组/单词
高效实现方案
方案1:使用REGEXP_SUBSTR原生捕获组参数(一次正则匹配,无嵌套)
Oracle的REGEXP_SUBSTR支持第6个参数指定返回的捕获组序号,无需嵌套正则即可直接提取目标分组内容,性能比嵌套写法提升1倍左右:
SELECT REGEXP_SUBSTR( 'The;quick;brown;fox;jumps;over;the;lazy;dog', '^([^;]*;){5}([^;]*)', 1, 1, NULL, 2) REF FROM DUAL;
直接返回预期结果over。
方案2:使用INSTR+SUBSTR组合(性能最优,适合百万级以上数据)
正则表达式的匹配开销远高于原生字符串操作,处理大数据量时推荐使用纯字符串函数实现,性能比正则方案高3-5倍:
SELECT SUBSTR( str, -- 定位第5个分号的下一位作为截取起点 INSTR(str, ';', 1, 5) + 1, -- 计算第5个分号到第6个分号之间的长度作为截取长度 INSTR(str, ';', 1, 6) - INSTR(str, ';', 1, 5) - 1 ) REF FROM ( SELECT 'The;quick;brown;fox;jumps;over;the;lazy;dog' str FROM DUAL ) t;
原写法问题说明
最初的正则^([^;]*;){5}([^;]*)会匹配从字符串开头到第6个字段结束的完整内容,所以返回了前缀串,嵌套正则相当于做了两次匹配运算,额外增加了性能开销。
内容的提问来源于stack exchange,提问作者Clint Mohamed
相关产品推荐
相关产品推荐

