У меня есть рабочий сценарий:
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
К сожалению, это не работает


В большинстве движков регулярных выражений граница слова \b может использоваться для получения отдельных слов.
Но в регулярном выражении Oracle вам нужно сделать это по-другому.
(^|\s)noun(e?s)?(\s|$)
(^|\s) : start of string or whitespace
(e?s)? : optional group that has 'es' or 's'
(\s|$) : whitespace or end of string
Настройка тестовых данных:
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 идентификаторов.
@MarioBernatti Просто придумал кое-что. Если вы также хотите сопоставить строку типа «abcd noun». тогда регулярное выражение должно быть (^|\W)noun(e?s)?(\W|$). \W соответствует символу, не являющемуся словом.
Если вы хотели использовать группу
()вместо[], возможно,^ ?noun( |s |es )$