正则表达式 Oracle Pl/Sql

Regular Expression Oracle Pl/Sql

我有以下

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),它们通常以下列形式出现'Type Name',例如 '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'。但是问题是我在没有内部类型的情况下也需要链的结束作为停止条件。

拜托,我需要这方面的帮助。 谢谢

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;

输出:4 AP

不需要行尾字符

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

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;