我正在使用名为“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
正如您所注意到的,当我使用具有此模式的函数时,所有这些都包含特殊字符并且所有这些都被认为是正确的。
如果我没有指定特殊字符,你知道为什么吗?如何使用此函数和此模式排除所有特殊字符?
答案 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 þ