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

Posted

技术标签:

【中文标题】可以在 PL/SQL 函数中使用正则表达式吗?【英文标题】:Is possible using Regular Expressions within PL/SQL function? 【发布时间】:2017-05-24 22:26:00 【问题描述】:

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

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;

有效的示例

不起作用的示例

【问题讨论】:

我不是专家,但您不想将-+ 作为您的replace 通话的一部分吗? RETURN REGEXP_REPLACE(p_cuit_cuil, '/+| +|-+', '-'); 我不能投票给你的评论。感谢您的帮助! 【参考方案1】:

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

例如

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

返回-98-46134679-1

这匹配一个或多个指定字符并将它们替换为单个-

【讨论】:

是的。你的答案是正确的。谢谢你的帮助。我已经编辑了我的代码,现在它工作正常!感谢大家的帮助!【参考方案2】:

这会让你开始:

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中匹配的信息。你可以先做那个函数,然后检查结果的长度等等。

【讨论】:

现场示例:livesql.oracle.com/apex/livesql/file/… [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] 可以简化为[0-9]8 当然;只是想使用与 OP 相同的语法;我还应该列出快捷方式,它也可以缩短第一部分:[0-9][0-9] 可能是 [0-9]2 感谢威廉的建议。

以上是关于可以在 PL/SQL 函数中使用正则表达式吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中使用正则表达式查找 POBOX - PL/SQL

PL/SQL 正则表达式检查

如何使用正则表达式或任何其他方法在 PL/SQL 中提取单引号内的字符串 [重复]

如何在 Pl/SQL 中编写正则表达式匹配模式?

PL/SQL 中的正则表达式

PL/SQL。使用 regexp_like 正则表达式解析 clob UTF8 字符