我有一个工作脚本:
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
答案 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。