在Oracle中优化Regexp

时间:2018-05-19 10:37:13

标签: sql regex oracle oracle11g

我有一个工作脚本:

Select col from table where regexp_like (col,'^noun[ |s |es ]| noun[ |s |es ]|noun[ |s |es ]$','i');

我可以将REGEXP中的三个块优化为更短的形式吗?

Good:
noun abcd
nouns abcd
abcd noun abcd
abcd nounes abcd
abcd noun

Wrong:
nounse abcd
abcd anouns abcd
abcd inoun

1 个答案:

答案 0 :(得分:3)

在大多数正则表达式引擎中,可以使用单词边界\b来获取单独的单词 但是在Oracle正则表达式中,您需要采用不同的方式。

(^|\s)noun(e?s)?(\s|$)
  

(^ | \ s):字符串或空格的开头
  (E?S)? :具有'es'或's'的可选组   (\ s | $):空格或字符串结尾

设置测试数据

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');

示例查询:

select * 
from test_table
where regexp_like (col,'(^|\s)noun(e?s)?(\s|$)','i');

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

select * 
from test_table
where regexp_like (col,'(^|\W)noun(e?s)?(\W|$)','i');

<强>结果:
前5个id。