Regex 可以在PL/SQL函数中使用正则表达式吗?
我正在编写一个简单的PL/SQL来格式化员工CUIL(Social Security ID)。问题是我想用一个或多个“-”或“/”或空格来替换一个简单的“-”,我的代码对空格和“/”很有效,但我没有幸运的其他代码。你能帮助我吗?谢谢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
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的建议。是的。你的回答是正确的。谢谢你的帮助。我已经编辑了我的代码,现在它可以正常工作了!谢谢大家的帮助!对你的回答是正确的。谢谢你的帮助。我已经编辑了我的代码,现在它可以正常工作了!谢谢大家的帮助!