Отрицательный взгляд назад, разрешить другие слова между ними

#regex

#регулярное выражение

Вопрос:

Следующее вернет значение NULL для 'im a cute hippo. you are a giraffe' , но как мне получить отрицательный взгляд, чтобы разрешить слова между cute и hippo? Я пытался (?<!scute.*) , но это недопустимо и (?<!scute)[^.]* позволяет все с hippo.

REGEXP_EXTRACT('im a cute and ugly hippo. you are a giraffe', '[^.?!]*(?<!scute)hippo[^.?!]*[?.]')

Хотите: вернуть значение NULL

Ответ №1:

Не все движки регулярных выражений допускают поиск с переменной длиной. Ваш, похоже, один из тех, которые этого не делают. (Вы не сказали, что именно вы используете, поэтому я не могу сказать наверняка.)

Вы можете сделать должное без поиска. Это выражение соответствует всем предложениям (*), где слово «милый» стоит перед словом «бегемот».

 [^.?!]*bcuteb[^.?!]*b(hippo)b[^.?!]*[.?!]
  

Возможно, вам потребуется второй шаг, чтобы извлечь из него подстроку, или, возможно, вы можете использовать группу.


«Разделы текста, разделенные , . , или ? ! (*) Это не удается для всех распространенных сценариев, таких как цитируемая речь или предложения с сокращениями или датами в них и т. Д. И т. Д.

Комментарии:

1. Чтобы уточнить, я хотел бы «я милый и уродливый бегемот. вы — жираф», чтобы вернуть значение NULL, но в настоящее время оно возвращает значение NULL только для «я милый бегемот. ты жираф «. Я попробовал предложенное вами регулярное выражение, но оно возвращает «Я милый бегемот». Я попробую второй шаг извлечения, спасибо!

2. @jyu429 Вам может показаться понятным, чего вы хотите, мне это непонятно. Попробуйте описать требование по-другому.

3. Конечно, я хочу идентифицировать все предложения со словом «бегемот» в нем, но НЕ в том случае, если перед ним где-нибудь есть «милый». Помогло ли это?

4. @jyu429 Ах, конечно. Я бы использовал для этого два шага — идентифицируйте все предложения с «hippo» одним выражением, а затем используйте AND NOT для удаления тех, которые вы не хотите иметь. В качестве настройки производительности сначала поместите выражение, которое удаляет больше строк из результирующего набора, в зависимости от ваших данных.