可以在 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