Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 可以在PL/SQL函数中使用正则表达式吗?_Regex_Oracle_Function_Plsql - Fatal编程技术网

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

Regex 可以在PL/SQL函数中使用正则表达式吗?,regex,oracle,function,plsql,Regex,Oracle,Function,Plsql,我正在编写一个简单的PL/SQL来格式化员工CUIL(Social Security ID)。问题是我想用一个或多个“-”或“/”或空格来替换一个简单的“-”,我的代码对空格和“/”很有效,但我没有幸运的其他代码。你能帮助我吗?谢谢 CREATE OR REPLACE FUNCTION formatear_cuit_cuil(p_cuit_cuil VARCHAR2) RETURN VARCHAR2 IS v_length VARCHAR2(50) := p_cuit_cuil; BEG

我正在编写一个简单的PL/SQL来格式化员工CUIL(Social Security 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;
创建或替换函数格式ear\u cuit\u cuil(p\u cuit\u cuil VARCHAR2)
返回VARCHAR2
是
v_length VARCHAR2(50):=p_cuit_cuil;
开始
如果
长度(REGEXP_替换(v_长度,[/| |.]+'))11然后
返回“El CUIT/CUIL no tiene El largo Corrector”;
如果结束;
如果
类正则表达式(
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]$'
)然后
返回REGEXP_REPLACE(p_cuit_cuil,'/+|+','-');
其他的
返回“CUIT/CUIL no tiene el formato correcto”;
如果结束;
例外情况
当其他人
返回'Error al formattear CUIT/CUIL';
端部模板;
有效的例子

不起作用的例子

这将让您开始:

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中匹配的信息。您可以先执行该功能,然后检查结果的长度等。

这将让您开始:

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中匹配的信息。您可以先执行该函数,然后检查结果的长度,等等。

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

e、 g

返回
-98-46134679-1


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

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

e、 g

返回
-98-46134679-1


这将匹配一个或多个指定字符,并用单个
-

替换它们。我不是专家,但您不希望
-+
作为
替换
调用的一部分吗<代码>返回REGEXP_REPLACE(p_cuit_cuil,'/+|+|-+','-')我不能对你的评论投票。谢谢你的帮助!我不是专家,但您不想将
-+
作为您的
替换
呼叫的一部分吗<代码>返回REGEXP_REPLACE(p_cuit_cuil,'/+|+|-+','-')我不能对你的评论投票。谢谢你的帮助!实例:
[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}
谢谢威廉的建议。实例:
[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}
谢谢William的建议。是的。你的回答是正确的。谢谢你的帮助。我已经编辑了我的代码,现在它可以正常工作了!谢谢大家的帮助!对你的回答是正确的。谢谢你的帮助。我已经编辑了我的代码,现在它可以正常工作了!谢谢大家的帮助!