"Совпадение, но исключение" в REGEXP_SUBSTR Amazon's Redshift - PullRequest
0 голосов
/ 21 марта 2019

Я прочитал много вопросов и информации о REGEX, но пока не нашел ничего убедительного.

Я использую REGEXP_SUBSTR в амазонском красном смещении, которое согласно документации использует аромат POSIX в стиле regex. Насколько я понимаю, это довольно просто, и не может смотреть в будущее.

Есть ли способ сопоставить шаблону, кроме символов, которые идут в начале или в конце?

Я пытаюсь проанализировать поле user_agent в нашей базе данных, и это действительно поможет.

Пример

Пример строки 1: 'Mozilla/5.0 (iPhone; CPU iPhone...'
Матч рассчитывал: iPhone

Пример строки 2: 'Mozilla/5.0 (Windows NT 10.0; Win64; ...'
Матч рассчитывал: Windows NT 10.0.

Я пытаюсь сопоставить то, что находится между первой скобкой и следующей точкой с запятой (iPhone), но исключает скобку и точку с запятой из совпадения.

На данный момент я использую '\\(.*;', но он довольно прост и кажется, что он может легко вернуть неправильное совпадение.

Я понимаю, что мог бы сопоставить возвращаемое совпадение с substring красного смещения, но в результате получается довольно грязный и непредсказуемый код. Мне интересно, можно ли было бы иметь совпадение с регулярным выражением, которое бы возвращало только необходимую строку.

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

Любая помощь или указатели будут очень признательны.

1 Ответ

1 голос
/ 27 марта 2019

Вложенный SPLIT_PART выполняет работу:

SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1)

Он делает именно то, что вы ищете, и пустой возврат может рассматриваться как значение NULL, если вы хотите:

NULLIF(SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1), '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...