REGEXP_LIKE,具有未在模式中定义的特殊字符

时间:2014-12-31 13:44:46

标签: oracle oracle11g oracle-sqldeveloper

我正在使用名为“REGEXP_LIKE”的函数,下面是下一个模式:

^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$

但是,我有一个包含要分析的下一个值的列:

REGEXP_LIKE (column_name,'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$')

FRANÞOISVERBEKE@TISCALINET.BE
GENEVIÞVE.DELSOIR@MINFIN.FED.BE
CREVECOEURÆ-OLI@HOTMAIL.COM
HERVÉ.GHILBERT@SKYNET.BE

正如您所注意到的,当我使用具有此模式的函数时,所有这些都包含特殊字符并且所有这些都被认为是正确的。

如果我没有指定特殊字符,你知道为什么吗?如何使用此函数和此模式排除所有特殊字符?

1 个答案:

答案 0 :(得分:2)

我不完全确定你能在正则表达式中完成此任务。但是,您可以添加一个额外的过滤器,如下所示:

SELECT * FROM table_name
 WHERE REGEXP_LIKE(column_name,'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$')
   AND REPLACE(TRANSLATE(LOWER(column_name), 'abcdefghijklmnopqrstuvwxyz0123456789@+.-_%','zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'),'z') IS NOT NULL

TRANSLATE()功能将取代所有"常规"字母(加上通常允许在电子邮件地址中使用的字符;我想我已经把它们全部拿到了)和#z; s; REPLACE()函数无需替换它们;如果结果字符串IS NOT NULL那么有"特殊"字符。

我无法确认这确实有效,因为我的数据库中的字符集是ASCII并且没有返回"特殊"正则表达式的字符。但我确认REPLACE(TRANSLATE())子句确实有效:

WITH t1 AS (
    SELECT 'FRANÞOISVERBEKE@TISCALINET.BE' AS mycolumn FROM dual
)
SELECT mycolumn
     , REPLACE(TRANSLATE(LOWER(mycolumn),'abcdefghijklmnopqrstuvwxyz0123456789@+.-_%','zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'),'z') AS mynewcolumn
  FROM t1
 WHERE REPLACE(TRANSLATE(LOWER(mycolumn),'abcdefghijklmnopqrstuvwxyz0123456789@+.-_%','zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'),'z') IS NOT NULL

结果:

MYCOLUMN                       MYNEWCOLUMN
FRANÞOISVERBEKE@TISCALINET.BE  þ