在工作中遇到这样一个问题:
从大段文本中利用正则表达式截取:如果有第一组表达式则从第一组表达式开始截取,如果没有,从第二组表达式开始
例如:
SELECT * FROM
(SELECT '该患者进行了EGFR中的20#外显子检测' diag_desc FROM dual
UNION ALL
SELECT '患者进行了20#检测' FROM dual)
对于第一条数据:需要从此文本中截取EGFR开始到20#结束
对于第二条数据:需要从此文本中截取20#
两个正则表达式或者的关系可以满足,
eg:
SELECT
diag_desc,
regexp_substr(diag_desc,'EGFR.*?20#|20#') reg_sub
FROM
(SELECT '该患者进行了EGFR 20#外显子检测' diag_desc FROM dual
UNION ALL
SELECT '患者进行了20#检测' FROM dual)
可以满足,但用了或者关系,两个正则拼接,在大数据量的情况下,效率较低。后咨询同事得知还有另一种写法:
SELECT
diag_desc,
regexp_substr(diag_desc,'(EGFR.*)?20#') reg_sub
FROM
(SELECT '该患者进行了EGFR 20#外显子检测' diag_desc FROM dual
UNION ALL
SELECT '患者进行了20#检测' FROM dual)
思想:利用EGFR.*为一组为A组,利用?匹配0次或一次,1次的话肯定包含A组,0次的话不包含A组直接从20#开始截取