【问题标题】:REGEXP_LIKE with special characters not defined in the pattern带有未在模式中定义的特殊字符的 REGEXP_LIKE
【发布时间】:2014-12-31 13:44:45
【问题描述】:

我正在使用名为“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

正如您所注意到的,它们都包含特殊字符,并且当我将函数与此模式一起使用时,它们都被认为是正确的。

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

【问题讨论】:

  • 其他人已经在这里检查过这个(可能略有不同的问题)。我建议您查看这个问题的答案,stackoverflow.com/questions/156430/…
  • @Patrick 很棒的链接。但我认为这里的问题是非 ASCII 字符与似乎只有 ASCII 的正则表达式匹配。
  • 可能与问题本身无关,但在我看来,您在这里有一些 mojibakeFRANÞOISVERBEKE 可能应该是 FRANÇOISVERBEKEGENEVIÈVE 也一样...顺便说一句,rfc6530 添加对电子邮件地址中非 ASCII 字符的支持。
  • 嗨,添加对非 ASCII 字符的支持是什么意思?目前,表中的值是这样的。我不能修改它们,我只需要过滤它们。
  • 它们没有被过滤掉,因为例如,连字 ÆA-Z 范围内 - 至少在您在数据库中使用的任何字符集中。

标签: oracle oracle11g oracle-sqldeveloper


【解决方案1】:

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

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  þ

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多