【问题标题】:Regular Expression Oracle Pl/Sql正则表达式 Oracle Pl/Sql
【发布时间】:2019-06-10 01:56:27
【问题描述】:

我有以下

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”。但问题是,在没有内部类型的情况下,我还需要链尾作为停止条件。

我需要这方面的帮助。 谢谢

【问题讨论】:

  • 这里提取字符串的一般规则是什么?从你的例子中看不出来,你能解释一下吗?

标签: oracle plsql regexp-substr


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:
    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

    不需要行尾字符

    【讨论】:

    • 它适用于'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'
    • Milton,您最好重新阅读 Kaushik 在您的问题下的评论中所说的话。目前尚不清楚要实施哪些规则才能从源数据中获取结果。此外,再举几个例子会有所帮助。只有一个是远远不够的。
    猜你喜欢
    • 2014-07-27
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多