在oracle中使用正则表达式提取子字符串

Extract substring with regexp in oracle

我有这个表情

(CONJ|ADL|ALD|ALM|ATR|VRD)(.)*{1,6}(TERPLN|SUITE|AGP|ALM|PT|$)

提取自

CL 18 A SUR 29 C 80 VRD LOS ARBOLES PT 20 

我需要提取物 'VRD LOS ARBOLES PT' 但是 REGEXP_SUBSTR return 'VRD LOS ARBOLES PT 20 '

请帮我解决这个问题

REGEXP_SUBSTR('CL 18 A SUR 29 C 80 VRD LOS ARBOLES PT 20','(CONJ|ADL|ALD|ALM|ATR|VRD)(.)*{1,6}(TERPLN|SUITE|AGP|ALM|PT|$)' )

您可能正在寻找这样的东西:

with
  inputs as (
    select 'CL 18 A SUR 29 C 80 VRD LOS ARBOLES PT 20' address from dual
  )
select regexp_substr(address, 
       '(CONJ|ADL|ALD|ALM|ATR|VRD).*?(TERPLN|SUITE|AGP|ALM|PT|$)') token
from   inputs
;

TOKEN
---------------------
VRD LOS ARBOLES PT

关键是交替之间的内容 - .*? 在这种情况下。

但是,请注意这是一种 危险的 方法 - 如果街道名称(或其他名称)实际上包含子字符串 PT 怎么办?

VRD 康普顿谷

搜索将 return VRD COMPT

问题出在您的数据模型上,而不是您对此类数据使用的特定查询。也许你可以要求在最后的交替之前有一个space;但即便如此,您也会在

这样的输入中得到错误的答案

VRD 托勒密花园