#regex #hive #hiveql #word-boundary #rlike
#регулярное выражение #улей #hiveql #граница слова #rlike
Вопрос:
Я новичок в сопоставлении регулярных выражений улья и изо всех сил пытаюсь найти правильный шаблон для сопоставления границ слов:
haystack RLIKE concat('(?i)b', 'needle', 'b')
ничего не возвращает.
Примерные значения, которые у меня есть в БД:
haystack
---------
needless to say
this is a needle
so many (needle)
these are needles
Когда я использую haystack RLIKE concat('(?i)', 'needle')
, он возвращает мне все строки , которые я на самом деле ищу this is a needle
.
Комментарии:
1. вы ищете логику, подобную — я должен прийти первым, а затем иглой? Затем вы можете использовать приведенную ниже логику —
where instr(col,'i') >0 AND instr(col,'needle') >0 AND instr(col,'i') < instr(col,'needle')
Ответ №1:
В улье используйте две обратные косые черты: \b
ДЕМОНСТРАЦИЯ:
with mytable as (
select stack(4,
'needless to say',
'this is a needle',
'so many (needle)',
'these are needles'
) as haystack
)
select haystack, haystack rlike concat('(?i)\b', 'needle', '\b') from mytable;
Результат:
haystack _c1
needless to say false
this is a needle true
so many (needle) true
these are needles false
Обратите внимание, что so many (needle)
это также сопоставляется, потому (
что и )
не являются символами слова.