Оптимизация регулярных выражений в Oracle - PullRequest
0 голосов
/ 19 мая 2018

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

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 голосов
/ 19 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...