В большинстве движков регулярных выражений для получения отдельных слов можно использовать границу слова \b
.
Но в Oracle regex это нужно делать по-другому.
(^|\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 идентификаторов.