Регулярные выражения: выберите те строки, в которых одно и то же слово повторяется 3 или более раз в одном предложении. - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть таблица с текстовым столбцом, и из этого мне нужно выбрать те строки, в которых одно и то же слово повторяется 3 или более раз в одном и том же предложении, в которых я и я - разные слова.Вот что я сделал, но это не работает должным образом.Одна буква - это слово, но букв может быть много.Конец предложения - это символы (точка,!,?)

select *
from text
where regexp_like(text,
 q'~([^[:alpha:]-]|^)
([[:alpha:]]{2,}(-[[:alpha:]]{2,})?|-[[:alpha:]]{2,}|[[:alpha:]]{2,}-)
[^[:alpha:]-]((.*?[^[:alpha:]-])?\2([^[:alpha:]-]|$)){2,}~','ix');    

образец текста:

-bad girls, -bad boys,-bad phone. phone phone mam: phone phone? 
wup, wup, BORAK OBAMA OBAMA MAMA; it is OBAMA . 
hustone, we have a problem, big problem. Very big, big, big
high cost - high perfomance, high 
full-hd,tv-full,full-hd:full-hd
Fooo fooo fooo , fooo-- fooo-- 
fooo feee faaa , fooo-fooo, fooo-fooo.
 a a a 
A. a a 

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете использовать регулярное выражение для поиска:

  • (^|[^[:alpha:]-]) Начало строки или несловесного символа;
  • ([[:alpha:]-]+) Затем сделанное словодо символов вашего слова;
  • (
    • [^[:alpha:]-.!?], за которыми следует конец, не являющийся предложением, не состоящий из слов;
    • ([^.!?]*[^[:alpha:]-.!?])? Затем, по выбору,любое количество конечных символов, не являющихся предложениями, следует за концом, не являющимся предложением, не состоящим из слов;
    • \2 Тогда ранее найденное слово
  • ){2}повторяется дважды;
  • ($|[^[:alpha:]-]) и, наконец, либо символ конца строки, либо символ, не содержащий слова.

Пример:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE strings ( value ) AS
SELECT '-bad girls, -bad boys,-bad phone. phone phone mam: phone phone? ' FROM DUAL UNION ALL
SELECT 'wup, wup, BORAK OBAMA OBAMA MAMA; it is OBAMA . ' FROM DUAL UNION ALL
SELECT 'hustone, we have a problem, big problem. Very big, big, big' FROM DUAL UNION ALL
SELECT 'high cost - high perfomance, high ' FROM DUAL UNION ALL
SELECT 'full-hd,tv-full,full-hd:full-hd' FROM DUAL UNION ALL
SELECT 'Fooo fooo fooo , fooo-- fooo-- ' FROM DUAL UNION ALL
SELECT 'fooo feee faaa , fooo-fooo, fooo-fooo.' FROM DUAL UNION ALL
SELECT ' a a a' FROM DUAL UNION ALL 
SELECT 'A. a a' FROM DUAL;

Запрос 1 :

SELECT value,
       REGEXP_SUBSTR(
         value, 
         '(^|[^[:alpha:]-])([[:alpha:]-]+)([^[:alpha:]-.!?]([^.!?]*[^[:alpha:]-.!?])?\2){2}($|[^[:alpha:]-])',
         1,
         1,
         NULL,
         2
       ) As match
FROM   strings
WHERE  REGEXP_LIKE(
         value,
         '(^|[^[:alpha:]-])([[:alpha:]-]+)([^[:alpha:]-.!?]([^.!?]*[^[:alpha:]-.!?])?\2){2}($|[^[:alpha:]-])'
       )

Результаты :

|                                                            VALUE |   MATCH |
|------------------------------------------------------------------|---------|
| -bad girls, -bad boys,-bad phone. phone phone mam: phone phone?  |    -bad |
|                 wup, wup, BORAK OBAMA OBAMA MAMA; it is OBAMA .  |   OBAMA |
|      hustone, we have a problem, big problem. Very big, big, big |     big |
|                               high cost - high perfomance, high  |    high |
|                                  full-hd,tv-full,full-hd:full-hd | full-hd |
|                                                            a a a |       a |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...