可以在PL / SQL函数中使用正则表达式吗?

时间:2017-05-24 22:26:00

标签: regex oracle function plsql

我正在编写一个简单的PL / SQL来格式化员工CUIL(社会安全ID)问题是我想替换一个或多个' - '或'/'或空格来换一个简单的' - '并且我的代码可以工作对于空格和'/'很好,但我对另一个没有幸运。你能帮助我吗?感谢

CREATE OR REPLACE FUNCTION formatear_cuit_cuil(p_cuit_cuil VARCHAR2)
RETURN VARCHAR2
IS
    v_length VARCHAR2(50) := p_cuit_cuil;
BEGIN
    IF
        LENGTH(REGEXP_REPLACE(v_length, '[/ | |.]+')) <> 11 THEN
            RETURN 'El CUIT/CUIL no tiene el largo correcto';
    END IF;

    IF 
        REGEXP_LIKE(
            p_cuit_cuil, 
            '^[0-9][0-9][ /-]+[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][ /-]+[0-9]$'
        ) THEN
            RETURN REGEXP_REPLACE(p_cuit_cuil, '/+| +', '-');
    ELSE
        RETURN 'CUIT/CUIL no tiene el formato correcto';
    END IF;
EXCEPTION
    WHEN OTHERS THEN
        RETURN 'Error al formatear CUIT/CUIL';
END formatear_cuit_cuil;

有效的示例 Works Fine!

不起作用的示例 Doesn't work

2 个答案:

答案 0 :(得分:0)

这将帮助您入门:

with a as  (
   select '98  46134679////1' as before from dual
union all
   select '98 ////// 46134679  1' as before from dual
) 
select a.before, 
       regexp_replace(a.before, 
       '^([0-9][0-9])([ /-])+([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])([ /-]+)([0-9])$', 
       '\1-\3-\5') as formatted from a;

产生这个:

BEFORE                      FORMATTED
98     46134679////  1      98-46134679-1
98 ////// 46134679  1       98-46134679-1

我基本上在部分数据周围使用括号组,并选择括号1中匹配的信息,后跟破折号,括号3中匹配的信息,后跟破折号,然后是括号5中匹配的信息。您可以先执行该功能,然后检查结果的长度等。

答案 1 :(得分:0)

这应该用作regexp_replace - '([ /-]+)', '-'

e.g。

select regexp_replace('///  98   //////   46134679    1', '([ /-]+)', '-')
  from dual

返回-98-46134679-1

匹配一个或多个指定字符,并将其替换为单个-