([[a-zа-я|А-Я]+)([[:space:]]+)\1
Данное регулярное выражение позволяет найти в тексте дубликаты слов, которые следует друг за другом. Например:
"Что мне мне делать".
Но каким должно быть регулярное выражение, если я хочу найти непоследовательно повторяющиеся слова?
Ответ
Можно воспользоваться следующим выражением:
SELECT * FROM regexTest WHERE
REGEXP_LIKE(
test,
'([^_a-zA-Z0-9а-яА-ЯёЁ]|^)([a-zA-Zа-яА-ЯёЁ]+)[^_a-zA-Z0-9а-яА-ЯёЁ].*\2',
'i')
См. демо регулярного выражения
Подробности
([^_a-zA-Z0-9а-яА-ЯёЁ]|^) - Захватываемая подмаска №1 (в регулярках Oracle нет поддержки незахватываемых групп): любой 1 символ, отличный от английских и русских букв, цифр и знака подчёркивания ([^_a-zA-Z0-9а-яА-ЯёЁ]) или (|) начало строки (^)
([a-zA-Zа-яА-ЯёЁ]+) - Захватываемая подмаска №2: 1 и более английских или русских букв
[^_a-zA-Z0-9а-яА-ЯёЁ] - любой 1 символ, отличный от английских и русских букв, цифр и знака подчёркования
.* - 0 и более любых символов, отличных от знака перевода на новую строку (если использовать модификатор n (т.е. третий аргумент должен быть 'in'), можно найти повторяющиеся слова на разных строчках строки)
\2 - обратная ссылка на значение захватываемой подмаски №2.
См. SQL-демо
CREATE TABLE regexTest(
test varchar2(50));
INSERT INTO regexTest VALUES ('Что мне тут мне делать');
INSERT INTO regexTest VALUES ('Что мне мне делать');
INSERT INTO regexTest VALUES ('Что тут мне делать');
INSERT INTO regexTest VALUES ('Что делать? Дела?');
INSERT INTO regexTest VALUES ('Дела,дела...');
INSERT INTO regexTest VALUES ('Ничего-ничего, так себе...');
COMMIT;
SELECT * FROM regexTest WHERE REGEXP_LIKE(test, '([^_a-zA-Z0-9а-яА-ЯёЁ]|^)([a-zA-Zа-яА-ЯёЁ]+)[^_a-zA-Z0-9а-яА-ЯёЁ].*\2')
Результат:
TEST
Что мне тут мне делать
Что мне мне делать
Дела,дела...
Ничего-ничего, так себе...
Флаг 'i' позволяет находить повторяющиеся слова в разных регистрах. Если его убрать, будут найдены только 2 результата:
Что мне тут мне делать
Что мне мне делать
Комментариев нет:
Отправить комментарий