我需要从电子邮件地址中替换一些字符。例如:
如果我的电子邮件地址是: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;之前包含替换必须在子字符串中的约束。
我可以得到任何帮助吗?
答案 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_REPLACE
或TRANSLATE
。
另一种选择是使用INSTR
和SUBSTR
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>