Oracle正则表达式在名称字段中查找特殊字符

时间:2016-03-10 16:45:48

标签: regex oracle

我试图过滤掉有特殊字符的名字。

要求:

1)过滤 a-zA-Z , space and forward slash(/)以外的字符的名称。

正在试用正则表达式:

1) regexp_like (customername,'[^a-zA-Z[:space:]\/]'))
2) regexp_like (customername,'[^a-zA-Z \/]'))

以上两个正则表达式有助于查找包含? and dot(.)

等特殊字符的名称

例如:

LEAL/JO?O

FRANCO/DIVALDO Sr.

但我无法弄清楚为什么有些名字(如下所列)with the allowed characters(a-zA-Z , space and forward slash(/)) also get retrieved.

例如:

ESTEVES/MARIA INES

PEREZ/JOSE

DUTRA SILVA/LIGIA

请帮助弄清楚正在使用的正则表达式中的错误。

非常感谢提前!

2 个答案:

答案 0 :(得分:1)

您的正则表达式#1在11g上为我工作,其中包含从此页面复制/粘贴的名称数据。我想知道你的数据中是否有不可打印的控制字符?尝试将[:cntrl:]添加到正则表达式以捕获控制字符。附:斜杠在字符类(方括号)内部之前不需要反斜杠。

SQL> with tbl(name) as (
      select 'LEAL/JO?O'          from dual union
      select 'FRANCO/DIVALDO Sr.' from dual union
      select 'ESTEVES/MARIA INES' from dual union
      select 'PEREZ/JOSE'         from dual union
      select 'DUTRA SILVA/LIGIA'  from dual
    )
    select *
    from tbl
    where regexp_like(name, '[^a-zA-Z[:space:][:cntrl:]/]');

NAME
------------------
FRANCO/DIVALDO Sr.
LEAL/JO?O

SQL>

如果你可以复制/粘贴它,运行它并获得相同的结果,那么表格中的数据就会出现问题。看看HEX中的数据,它可能会揭示以前隐藏的角色。这是一个简单的例子,在HEX中显示名称“JOSE”。使用众多ASCII图表中的一个,如http://www.asciitable.com/,您可以看到没有隐藏的字符:

SQL> select 'JOSE' as chr, rawtohex('JOSE') as hex from dual;

CHR  HEX
---- --------
JOSE 4A4F5345

SQL>

所以,看看一两个名字,看看你是否有任何隐藏的角色。如果没有,我怀疑可能存在冲突的角色问题。

答案 1 :(得分:0)

@gary_w已经覆盖了大部分基地......

这是我的unix的sql版本:cat -vet MyFile

select replace(regexp_replace(my_column,'[^[:print:]]', '!ACK!'),' ','.') as CAT_VET
from my_table

...所有非打印字符变为!ACK!,空格变为.您仍然需要确定字符实际上是什么,但找到looney-toon很有用数据中的字符。

此外,select dump(my_column) ...是查看原始列值的另一种方法。