我试图过滤掉有特殊字符的名字。
要求:
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
请帮助弄清楚正在使用的正则表达式中的错误。
非常感谢提前!
答案 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) ...
是查看原始列值的另一种方法。