Oracle:子字符串中的REGEXP_REPLACE

时间:2018-02-09 16:57:04

标签: oracle regexp-replace

我需要从电子邮件地址中替换一些字符。例如:

如果我的电子邮件地址是:patty.beads@mydomain.com,则输出应为:

pattybeads@mydomain.com <-- removed '.' before '@mydomain.com'

如果我的电子邮件地址是patty.beads+something@mydomain.com,那么输出应该是:

patty.beads+something@mydomain.com <-- removed '.' and '+' before '@mydomain.com'

因此,应该删除@ mydomain.com之前的某些字符(例如&#39;。&#39;,&#39; +&#39;等)。虽然我看到我可以使用REGEXP_REPLACE来替换这些字符,但是很难理解如何在@&#39; @&#39;之前包含替换必须在子字符串中的约束。

我可以得到任何帮助吗?

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找的是How to match "anything up until this sequence of characters" in a regular expression?

哪个Oracle在数据库中没有实现(据我所知)

所以这意味着基于@拼接它,从第一部分中删除。| +,然后再连接在一起。

SQL> with q as ( select 'patty.beads+something@mydomain.com' email from dual ) 
    select 
          REGEXP_REPLACE(substr(q.email,0,instr(q.email,'@')-1),'\.|\+','',1,0) 
          ||
          substr(q.email,instr(q.email,'@')) new_email
        from q;

NEW_EMAIL                       
--------------------------------
pattybeadssomething@mydomain.com

答案 1 :(得分:1)

您可以拆分域名和名称,然后在名称上应用REGEXP_REPLACETRANSLATE

另一种选择是使用INSTRSUBSTR

SQL Fiddle

Oracle 11g R2架构设置

create table yourtable as
select 'pattybeads@mydomain.com' emailid FROM DUAL UNION ALL
select 'patty.beads@mydomain.com' FROM DUAL UNION ALL
select 'patty.beads+something@mydomain.com' FROM DUAL

查询1

select TRANSLATE (name, 'a.+', 'a' ) ||domain emailid
FROM
( SELECT 
    REGEXP_SUBSTR ( emailid, '(.+@)(.+)' ,1,1,NULL,1) name,
    REGEXP_SUBSTR ( emailid, '(.+)@(.+)' ,1,1,NULL,2) domain 
FROM yourtable
 )

<强> Results

|                          EMAILID |
|----------------------------------|
|          pattybeads@mydomain.com |
|          pattybeads@mydomain.com |
| pattybeadssomething@mydomain.com |

查询2

 select TRANSLATE ( SUBSTR (emailid,1,INSTR( emailid,'@' ) -1 ) ,
          'a.+', 'a' )||
         SUBSTR (emailid,INSTR( emailid,'@'  ) ) emailid
 FROM yourtable

<强> Results

|                          EMAILID |
|----------------------------------|
|          pattybeads@mydomain.com |
|          pattybeads@mydomain.com |
| pattybeadssomething@mydomain.com |

答案 2 :(得分:1)

如果我理解正确,您只想在电子邮件地址的第一部分留下字母(可能是数字?)。如果是这样,那怎么样?

REGEXP_REPLACE中,\W表示非单词,所以 - 任何不是字母或数字或下划线的内容(因为它被认为是成为单词)正被删除。为了删除下划线,添加了|_ - 最后 - 它被读作删除非单词或下划线

SQL> with test (email) as (
  2    select 'pattybeads@mydomain.com'            from dual union all
  3    select 'patty.beads@mydomain.com'           from dual union all
  4    select 'patty.beads+something@mydomain.com' from dual union all
  5    select 'patty-beads$something@mydomain.com' from dual union all
  6    select 'pat_ty#b.e?a!d*s@mydomain.com'       from dual
  7  )
  8  select email,
  9    regexp_replace(substr(email, 1, instr(email, '@')), '\W|_', '') ||
 10    substr(email, instr(email, '@')) result
 11  from test;

EMAIL                              RESULT
---------------------------------- ----------------------------------------
pattybeads@mydomain.com            pattybeads@mydomain.com
patty.beads@mydomain.com           pattybeads@mydomain.com
patty.beads+something@mydomain.com pattybeadssomething@mydomain.com
patty-beads$something@mydomain.com pattybeadssomething@mydomain.com
pat_ty#b.e?a!d*s@mydomain.com      pattybeads@mydomain.com

SQL>