根据前面或后面的字符删除某些字符 - ORACLE

时间:2014-01-24 08:36:24

标签: sql regex oracle

我使用了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并将;;替换为;

有没有删除任何前面或后面没有任何字符的分号?

3 个答案:

答案 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 |