我使用了REPLACE
函数来删除数百条记录中的电子邮件地址。但是,众所周知,分号是分隔符,通常在每个电子邮件地址和另一个电子邮件地址之间。问题是,随机留下了很多分号。
例如:字段:
123@hotmail.com;456@yahoo.com;789@gmail.com;xyz@msn.com
假设在删除两个电子邮件地址后,字段内容变为:
;456@yahoo.com;789@gmail.com;
我需要从这些额外的不需要的分号中清除这些字段,就像
一样 456@yahoo.com;789@gmail.com
对于双分号,我使用REPLACE
并将;;
替换为;
有没有删除任何前面或后面没有任何字符的分号?
答案 0 :(得分:2)
如果你只需要在字符串的开头或结尾替换分号,使用带有'^'(字符串的开头)/'$'(字符串结尾)的正则表达式应该达到你想要的效果:< / p>
with v_data as (
select '123@hotmail.com;456@yahoo.com;789@gmail.com;xyz@msn.com' value
from dual union all
select ';456@yahoo.com;789@gmail.com;' value from dual
)
select
value,
regexp_replace(regexp_replace(value, '^;', ''), ';$', '') as normalized_value
from v_data
如果你还需要从字符串中间替换杂散分号,你可能需要具有前瞻/后看的正则表达式。
答案 1 :(得分:2)
使用TRIM删除前导和尾随字符:
select trim(both ';' from ';456@yahoo.com;;;789@gmail.com;') from dual;
要仅使用一次出现替换多个字符,请使用REGEXP_REPLACE:
select regexp_replace(';456@yahoo.com;;;789@gmail.com;', ';+', ';') from dual;
两种方法相结合:
select regexp_replace( trim(both ';' from ';456@yahoo.com;;;789@gmail.com;'), ';+', ';' ) from dual;
答案 2 :(得分:1)
正则表达式替换可以帮助
select regexp_replace('123@hotmail.com;456@yahoo.com;;456@yahoo.com;;789@gmail.com',
'456@yahoo.com(;)+') as result from dual;
输出:
| RESULT |
|-------------------------------|
| 123@hotmail.com;789@gmail.com |