Оптимизация Regexp в Oracle

У меня есть рабочий сценарий:

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

Если вы хотели использовать группу () вместо [], возможно, ^ ?noun( |s |es )$

The fourth bird 19.05.2018 12:43

К сожалению, это не работает

Mario Bernatti 19.05.2018 13:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В большинстве движков регулярных выражений граница слова \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 соответствует символу, не являющемуся словом.

LukStorms 19.05.2018 14:16

Другие вопросы по теме