Регулярные выражения 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_direction также может быть «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». Но проблема в том, что мне также нужен конец цепочки как условие остановки, когда нет внутреннего типа.

Пожалуйста, мне нужна помощь с этим. Спасибо


person Milton    schedule 16.01.2019    source источник
comment
Каково общее правило извлечения строки? Не могу понять из ваших примеров, не могли бы вы объяснить немного больше?   -  person Kaushik Nayak    schedule 16.01.2019


Ответы (2)


Добавьте конец строки $ в качестве одного из суффиксов имени типа в ваше регулярное выражение:

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;
person MT0    schedule 16.01.2019

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 АП

Символ конца строки не нужен

person q4za4    schedule 16.01.2019
comment
Это работает для «BL 93 IN 4 AP 401 PABLO VI II SEC», но не для строки «ED 4F CON Las Flores Cinco», «ED 4F CON Las Flores Cinco», -> «CON Las Flores». - person Milton; 16.01.2019
comment
Милтон, ты бы лучше перечитал, что сказал Кошик в своем комментарии под твоим вопросом. Неясно, какие правила реализовать, чтобы получить результат из исходных данных. Кроме того, не помешало бы еще несколько примеров. Только одного далеко не достаточно. - person Littlefoot; 16.01.2019