Страницы

Поиск по вопросам

воскресенье, 21 октября 2018 г.

Регулярное выражение для поиска непоследовательных дубликатов слов

([[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 результата:
Что мне тут мне делать Что мне мне делать

Комментариев нет:

Отправить комментарий