Вы можете использовать регулярное выражение для поиска:
(^|[^[: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 |