我必须找到一个名称,例如:Robert @ jr23(必须有字母,任何特殊字符或数字,但连字符(-),撇号(')和空格除外)。
我正在做以下事情:
select * from test where REGEXP_LIKE(trim(NAME_1),'[^- '']')
但是我没有得到正确的结果。
需要匹配:
Kevin#123
bob@jr
mike$dr
需要排除:
Alex-jr
Robert'jr
Brian jr
您需要使用not
并使用与要排除的值相匹配的模式。否则,您将匹配包含所有不在排除列表中的任何字符的字符串。
select column_value
from ora_mining_varchar2_nt
( 'Kevin#123','bob@jr','mike$dr','Alex-jr','Robert''jr','Brian jr','A!' )
where 1=1
and not regexp_like(column_value,'[- '']')
and regexp_like
(column_value,'([A-Z0-9]+[^A-Z0-9])|([^A-Z0-9]+[A-Z0-9])','i') ;
编辑:添加了regex_like
条件,以确保值包含字母或数字和“特殊字符”,此处的字符既不是字母,数字也不是空格,'
或{ {1}}。
一种选择是用Hello
替换所有有效的内容,而剩下的是无效:
Property 'saySomething' does not exist on type 'B'.(2339)
我对您实际上想要得到的结果感到困惑。以下是一些示例,显示了此类正则表达式的结果;您想获得哪些ID?
NULL
您的一条评论说:
选择一个必须包含特殊字符或数字(空格,连字符和撇号除外)的客户名称
表示数字和特殊字符应被视为“相等”。如果是这样,这有帮助吗?
SQL> with test (col) as
2 (select 'Robert@jr23' from dual union all
3 select 'Kevin#123' from dual union all
4 select 'bob@jr' from dual union all
5 select 'mike$dr' from dual union all
6 select 'Alex-jr' from dual union all
7 select 'Robert''jr' from dual union all
8 select 'Brian jr' from dual
9 )
10 select col
11 From test
12 where regexp_replace(col,'[[:alpha:]]|[[:digit:]]|-|''',null) is not null;
COL
-----------
Robert@jr23
Kevin#123
bob@jr
mike$dr
Brian jr
SQL>
,
您可以使用以下查询来包含除space,- and '
以外的所有特殊字符
SQL> with tbl(name) as (
2 select 'Kevin#123' from dual union
3 select 'bob@jr' from dual union
4 select 'mike$dr' from dual union
5 select 'Alex-jr' from dual union
6 select 'Brian jr' from dual union
7 select 'Brian)jr' from dual union
8 select 'Robert''jr' from dual
9 )
10 select *
11 from tbl
12 where regexp_like(name,'[^[a-z]|[A-Z]|[:space:]|[:cntrl:]|/]')
13 and not regexp_like(name,'[- '']');
NAME
---------
Brian)jr -- see this is included
Kevin#123
bob@jr
mike$dr
SQL>