首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中Regexp的优化

Oracle中Regexp的优化
EN

Stack Overflow用户
提问于 2018-05-19 10:37:12
回答 1查看 116关注 0票数 1

我有一个工作脚本:

代码语言:javascript
复制
Select col from table where regexp_like (col,'^noun[ |s |es ]| noun[ |s |es ]|noun[ |s |es ]$','i');

我能把REGEXP中的三个块优化成一个更短的形式吗?

代码语言:javascript
复制
Good:
noun abcd
nouns abcd
abcd noun abcd
abcd nounes abcd
abcd noun

Wrong:
nounse abcd
abcd anouns abcd
abcd inoun
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-19 11:53:14

在大多数正则表达式引擎中,可以使用单词边界\b来获取独立的单词。

但在Oracle regex中,您需要采取不同的做法。

代码语言:javascript
复制
(^|\s)noun(e?s)?(\s|$)

(^x\s):字符串或空格的开始 (e?s):有“es”或“s”的可选组 (\s=$):空格或字符串结尾

设置测试数据:

代码语言:javascript
复制
create table test_table (id number(8,0), col varchar2(30), matchexpected char(1));

insert into test_table (id, col, matchexpected) values (1,'noun abcd','Y');
insert into test_table (id, col, matchexpected) values (2,'nouns abcd','Y');
insert into test_table (id, col, matchexpected) values (3,'abcd NOUN abcd','Y');
insert into test_table (id, col, matchexpected) values (4,'abcd nounEs abcd','Y');
insert into test_table (id, col, matchexpected) values (5,'abcd noun','Y');

insert into test_table (id, col, matchexpected) values (6,'nounse abcd','N');
insert into test_table (id, col, matchexpected) values (7,'abcd anouns abcd','N');
insert into test_table (id, col, matchexpected) values (8,'abcd inoun','N');

示例查询:

代码语言:javascript
复制
select * 
from test_table
where regexp_like (col,'(^|\s)noun(e?s)?(\s|$)','i');

或者在正则表达式中使用\W (非字字符:[^A-Za-z0-9_])。而不是\s (空格)。也可以匹配"abc nounes!“这样的字符串。

代码语言:javascript
复制
select * 
from test_table
where regexp_like (col,'(^|\W)noun(e?s)?(\W|$)','i');

结果:

前5个身份证。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50424346

复制
相关文章

相似问题

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