正则表达式Oracle Pl / Sql

时间:2019-01-16 01:37:50

标签: oracle plsql regexp-substr

我有以下

lvc_direccion := 'BL 93 IN 4 AP 401 PABLO VI II SEC';
lvc_Inmueble := REGEXP_SUBSTR (lvc_direccion, '(CONJ|ADL|ALD|ALM|APO|ATR|CAS|CEN|CLJ|CON|ESQ|FCA|TER|URB|VRD|AG|CA|CC|CD|ED|EX|HC|IN|OF|PJ|UN|UR|ZF|C){1}.*? ((TERPLN|SUITE|AGP|ALM|CEL|MLL|PAR|POR|POS|PRJ|SEC|AD|AL|AP|BG|BL|CA|CS|DP|DS|ED|EN|ET|GJ|GS|GT|HG|LC|LM|LT|MD|MJ|MN|MZ|OF|PA|PD|PH|PL|PN|PQ|PS|PT|PW|RP|SA|SC|SD|SL|SS|ST|TO|TZ|ZN|P)|.*)$');

我需要lvc_Inmueble等于'IN 4 AP',但显示为'IN 4 AP 401 PABLO VI II SEC'。

但是lvc_direccion也可以是'ED 4F CON Las Flores Cinco',必须获得'CON Las Flores Cinco'。

我有一个地址列表,我需要从中提取属性的类型,这些类型是(CONJ,ADL,ALD,ALM,APO,ATR,CAS,CEN,CLJ,CON,ESQ,FCA, TER,URB,VRD,AG,CA,CC,CD,ED,EX,HC,IN,OF,PJ,UN,UR,ZF,C),它们通常以以下形式出现:“类型名称”,例如“ URB La Tosa”或“ CA 34”,问题在于子字符串位于字符串“ CRA 30 15 52 URB La Tosa AP 42”或“ CRA 30 15 52 URB La Tosa”或其他链中,且具有相同的区别属性类型,我使用内部类型(TERPLN,SUITE,AGP,ALM,CEL,MLL,PAR,POR,POS,PRJ,SEC,AD,AL,AP,BG,BL,CA,CS,DP,DS, ED,EN,ET,GJ,GS,GT,HG,LC,LM,LT,MD,MJ,MN,MZ,OF,PA,PD,PH,PL,PN,PQ,PS,PT,PW,RP, SA,SC,SD,SL,SS,ST,TO,TZ,ZN,P)作为停止条件,因此我提取了“ URB La Tosa AP”。但是问题在于,当没有内部类型时,我还需要将链的末端作为停止条件。

请为此我需要帮助。 谢谢

2 个答案:

答案 0 :(得分:0)

declare
lvc_direccion varchar2(200);
lvc_Inmueble  varchar2(2000);
begin
lvc_direccion := 'BL 93 IN 4 AP 401 PABLO VI II SEC';
lvc_Inmueble := REGEXP_SUBSTR (lvc_direccion, '(CONJ|ADL|ALD|ALM|APO|ATR|CAS|CEN|CLJ|CON|ESQ|FCA|TER|URB|VRD|AG|CA|CC|CD|ED|EX|HC|IN|OF|PJ|UN|UR|ZF|C){1}.*?((TERPLN|SUITE|AGP|ALM|CEL|MLL|PAR|POR|POS|PRJ|SEC|AD|AL|AP|BG|BL|CA|CS|DP|DS|ED|EN|ET|GJ|GS|GT|HG|LC|LM|LT|MD|MJ|MN|MZ|OF|PA|PD|PH|PL|PN|PQ|PS|PT|PW|RP|SA|SC|SD|SL|SS|ST|TO|TZ|ZN|P))');


dbms_output.put_line( lvc_Inmueble);
end;

输出:IN 4 AP

行尾的字符是不必要的

答案 1 :(得分:0)

将字符串结尾$作为类型名称后缀之一添加到正则表达式中:

DECLARE
  lvc_direccion varchar2(200) := 'BL 93 IN 4 AP 401 PABLO VI II SEC';
  lvc_Inmueble  varchar2(2000);
  p_prefixes    VARCHAR2(500) := 'CONJ|ADL|ALD|ALM|APO|ATR|CAS|CEN|CLJ|CON|ESQ|FCA|TER|URB|VRD|AG|CA|CC|CD|ED|EX|HC|IN|OF|PJ|UN|UR|ZF|C';
  p_suffixes    VARCHAR2(500) := 'TERPLN|SUITE|AGP|ALM|CEL|MLL|PAR|POR|POS|PRJ|SEC|AD|AL|AP|BG|BL|CA|CS|DP|DS|ED|EN|ET|GJ|GS|GT|HG|LC|LM|LT|MD|MJ|MN|MZ|OF|PA|PD|PH|PL|PN|PQ|PS|PT|PW|RP|SA|SC|SD|SL|SS|ST|TO|TZ|ZN|P';
  p_regexp      VARCHAR2(1100) := '(' || p_prefixes || ').*?(' || p_suffixes || '|$)';
BEGIN
  lvc_Inmueble  := REGEXP_SUBSTR( lvc_direccion, p_regexp );

  DBMS_OUTPUT.PUT_LINE( lvc_Inmueble );
END;