首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reg_exp不喜欢-Oracle11g

Reg_exp不喜欢-Oracle11g
EN

Stack Overflow用户
提问于 2014-05-19 08:31:05
回答 1查看 5.3K关注 0票数 1

我正在运行Oracle11g,试图查找记录中不包含下面列出的字符的所有条目。

有效字符列表:abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/

到目前为止,我得到的是:

代码语言:javascript
复制
SELECT * FROM Table1 WHERE NOT
REGEXP_LIKE(TRIM(UPPER(name1)),'abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/')

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-19 09:41:44

REGEXP_LIKE中的第二个参数是一个冗长的模式,从abc....-/开始。由于您的表不太可能包含具有此模式的名称,因此它将不匹配任何行。NOT的存在将反转这一点,您将得到表中的所有行。

你应该在这里做的是匹配任何字符,而不是整体模式。所以你应该把它放在方括号里。

代码语言:javascript
复制
SELECT * FROM Table1 
WHERE NOT REGEXP_LIKE(TRIM(UPPER(name1)),'[abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/]');

但这只适用于只包含无效字符的名称。如果名称同时包含有效字符和无效字符,regex将匹配,而不将导致该行不显示。

因此,应该在方括号内使用^来排除有效字符,并从条件中删除NOT。

代码语言:javascript
复制
SELECT * FROM Table1 
WHERE REGEXP_LIKE(TRIM(UPPER(name1)),'[^abcdefghijklmnopqrstuvwxyzæøå0123456789èüeäö.,’&-/]');

这将只匹配那些包含regex中不存在的字符的名称。

您可以通过使用:alnum:或\w字符类进一步简化这一点。这将匹配所有的字母和数字。你也可以去掉上面的函数。

代码语言:javascript
复制
SELECT * FROM Table1 
WHERE REGEXP_LIKE(TRIM(name1),'[^[:alnum:].,’&-/]');

示例:

代码语言:javascript
复制
SQL> with x(y) as (
        select 'y.s&'||'d' from dual union all
        select '4rc y'     from dual union all
        select 'üe'        from dual union all
        select 'æøå'       from dual union all
        select 'Z%'        from dual union all
        select '!'         from dual
        )
SELECT * FROM x
 WHERE REGEXP_LIKE( TRIM(y),'[^[:alnum:].,’&-/]'); 

Y
------
4rc y
Z%
!

更新:

  • \w匹配值也是下划线。它相当于[:alnum:_]。
  • 如果将空格字符添加到有效字符列表中,则可以去掉TRIM函数。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23733097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档