Как извлечь все хэштеги из строки с помощью regexp_substr

Мне нужен шаблон регулярного выражения, который извлекает все хэштеги из твитов в таблице. Мои данные вроде

select regexp_substr('My twwet #HashTag1 and this is the #SecondHashtag    sample','#\S+')
from dual

он приносит только #HashTag1, а не #SecondHashtag

Мне нужен вывод, например #HashTag1 #SecondHashtag

Спасибо


person ilhan    schedule 18.03.2017    source источник
comment
Вы говорите, что вам нужен вывод в этом формате, но в большинстве случаев вам следует искать вывод в отдельных строках (как показывает GurV во втором подходе).   -  person mathguy    schedule 18.03.2017


Ответы (1)


Вы можете использовать regexp_replace, чтобы удалить все, что не соответствует вашему шаблону.

with t (col) as (
  select 'My twwet #HashTag1 and this is the #SecondHashtag    sample, #onemorehashtag'
  from dual
)
select 
  regexp_replace(col, '(#\S+\s?)|.', '\1')
from t;

Производит;

#HashTag1 #SecondHashtag #onemorehashtag

regexp_substr вернет одно совпадение. Что вы можете сделать, так это превратить вашу строку в таблицу, используя connect by:

with t (col) as (
  select 'My twwet #HashTag1 and this is the #SecondHashtag    sample, #onemorehashtag'
  from dual
)
select 
  regexp_substr(col, '#\S+', 1, level)
from t
connect by regexp_substr(col, '#\S+', 1, level) is not null;

Возвращает:

#HashTag1
#SecondHashtag
#onemorehashtag

РЕДАКТИРОВАТЬ:

\S соответствует любому непробельному символу. Было бы лучше использовать \w, который соответствует az, AZ, 0-9 и _.

Как прокомментировал @mathguy и с этого сайта : хэштег начинается с алфавита, затем допускаются буквенно-цифровые символы или символы подчеркивания.

Так что паттерн #[[:alpha:]]\w* будет работать лучше.

with t (col) as (
  select 'My twwet #HashTag1, this is the #SecondHashtag. #onemorehashtag'
  from dual
)
select 
  regexp_substr(col, '#[[:alpha:]]\w*', 1, level)
from t
connect by regexp_substr(col, '#[[:alpha:]]\w*', 1, level) is not null;

Производит:

#HashTag1
#SecondHashtag
#onemorehashtag
person Gurwinder Singh    schedule 18.03.2017
comment
Это выглядит хорошо, и второе решение, вероятно, имеет больше смысла в большинстве ситуаций. Однако вам также необходимо обрабатывать знаки препинания и не буквенно-цифровые символы в целом; у вас может быть что-то вроде 'My hashtag is #MyHashtag, yours is #YourHashtag, etc.' - здесь хэштеги не должны поднимать запятую как часть хэштега. - person mathguy; 18.03.2017
comment
Я только что проверил хэштеги в Твиттере: они должны начинаться с буквы и содержать только буквы, цифры и знак подчеркивания. Так что что-то вроде '#[[:alpha:]][[:alnum:]_]* должно работать. (Не уверен, что существует также минимальная длина, которую можно легко приспособить.) - person mathguy; 18.03.2017
comment
@mathguy - Обновлен ответ. Спасибо за комментарий. - person Gurwinder Singh; 18.03.2017