Как определить слова между определенным шаблоном, используя регулярное выражение: Oracle? - PullRequest
3 голосов
/ 27 сентября 2019

У меня есть текстовое поле.Мне нужно определить слова между шаблоном <a href и a>.

Этот шаблон может быть в начале / конце / середине текста.

with t as (
select '<a href Part of the technical Network Group www.tech.com/sites/ hh a>' as text from dual
union select '<a href www.tech.technical Network a>' as text from dual union
select 'www.tech.tech///technical <a href Network Group a>' as text from dual)
select * from t
WHERE REGEXP_LIKE(text,'(^|\W)<a href\S*','i') 

Это дает мнепервые 2 строки результатов, что верно.Но мне нужно проверить слово «группа» (без учета регистра).Как мы проверяем слово «группа», а также слово должно быть в шаблоне.В этом случае должны быть возвращены 1-й и 3-й ряд.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вы можете просто расширить свое регулярное выражение, например: <a href.*group.*a>.

Демонстрация на скрипте БД :

with t as (
    select '<a href Part of the technical Network Group www.tech.com/sites/ hh a>' as text from dual
    union all select '<a href www.tech.technical Network a>' as text from dual
    union all select 'www.tech.tech///technical <a href Network Group a>' as text from dual)
select * from t
WHERE REGEXP_LIKE(text,'<a href.*group.*a>','i') 
| TEXT                                                                  |
| :-------------------------------------------------------------------- |
| <a href Part of the technical Network Group www.tech.com/sites/ hh a> |
| www.tech.tech///technical <a href Network Group a>                    |

Примечание. Это работает, если ваш текст содержит только один <a href ... a>шаблон, который имеет место в ваших образцах данных.


Вы можете улучшить регулярное выражение, чтобы оно совпадало только со словом 'group' (но не с другими словами, которые содержат 'group', например 'workgroup' или 'grouped'):

<a href.*\sgroup\s.*a>

Это работает, если за <a href всегда следует пробел, а a> всегда предшествует пробел.

Демонстрация на DB Fiddle

1 голос
/ 27 сентября 2019

Поиск полного шаблона, а затем поиск слова Group в подстроке этого шаблона.Если в тексте несколько совпадений, вы можете использовать рекурсивное условие подзапроса для их поиска:

Oracle Setup :

CREATE TABLE table_name ( id, text ) AS
select 1, '<a href Part of the technical Network Group www.tech.com/sites/ hh a>' from dual union all
select 2, '<a href www.tech.technical Network a>' from dual union all
select 3, 'www.tech.tech///technical <a href Network Group a>' from dual union all
select 4, '<a hrefgroup a>' FROM DUAL UNION ALL
select 5, '<a href groupa>' FROM DUAL UNION ALL
select 6, '<a href workgroup a>' FROM DUAL UNION ALL
select 7, '<a href test1 a> Group <a href test2 a>' FROM DUAL;

Запрос :

WITH positions ( id, text, match, position ) AS (
  SELECT id,
         text,
         REGEXP_SUBSTR(
           text,
           '(^|\W)<a href\s+.*?\s+a>(\W|$)',
           1,
           1,
           'i'
         ),
         REGEXP_INSTR(
           text,
           '(^|\W)<a href\s+.*?\s+a>(\W|$)',
           1,
           1,
           0,
           'i'
         )
  FROM   table_name
UNION ALL
  SELECT id,
         text,
         REGEXP_SUBSTR(
           text,
           '(^|\W)<a href\s+.*?\s+a>(\W|$)',
           position + 1,
           1,
           'i'
         ),
         REGEXP_INSTR(
           text,
           '(^|\W)<a href\s+.*?\s+a>(\W|$)',
           position + 1,
           1,
           0,
           'i'
         )
  FROM   positions
  WHERE  position > 0
)
SELECT id,
       text
FROM   positions
WHERE  REGEXP_LIKE( match, '\sGroup\s', 'i' );

Вывод :

ID | TEXT                                                                 
-: | :--------------------------------------------------------------------
 1 | <a href Part of the technical Network Group www.tech.com/sites/ hh a>
 3 | www.tech.tech///technical <a href Network Group a>                   

db <> скрипка здесь

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