【问题标题】:Oracle : REGEXP_REPLACE in a substringOracle:子字符串中的 REGEXP_REPLACE
【发布时间】:2018-07-20 12:12:08
【问题描述】:

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

如果我的电子邮件地址是: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 之前的一些字符(如 '.'、'+' 等)。虽然我看到我可以使用 REGEXP_REPLACE 替换这些字符,但很难理解如何包含替换必须在 '@' 之前的子字符串中的约束。

我可以得到任何帮助吗?

【问题讨论】:

    标签: oracle regexp-replace


    【解决方案1】:

    我想你要找的是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
    

    【讨论】:

    • 应该说 regex_replace 的完整文档在这里可以更可靠地解释参数:docs.oracle.com/database/121/SQLRF/functions163.htm#SQLRF06302
    • 但这取代了“。”来自@mydomain.com 也是意料之中的。结果应该是 pattybeadssomething@mydomain.com(那些字符应该在 @mydomain.com 部分之前替换)
    【解决方案2】:

    您可以拆分域名和名称,然后在名称上应用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 |
    

    【讨论】:

      【解决方案3】:

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

      REGEXP_REPLACE 中,\W 代表一个非单词,所以 - 任何不是字母、数字或下划线的东西(因为它被认为是一个 word) 正在被删除。为了同时删除下划线,添加了|_,因此 - 最后 - 它被读作删除非单词或下划线

      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>
      

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 2021-12-29
        • 2012-09-25
        • 2020-03-26
        • 2017-02-26
        • 2016-06-07
        • 1970-01-01
        • 2015-03-12
        • 2015-08-09
        相关资源
        最近更新 更多