Как получить все цифры перед персонажем? - PullRequest
1 голос
/ 26 марта 2019

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

[some text/][digits(one or more)]_[some text]

Например,

'Main/Search/124_mobile'
'Main/Search/4_service'

Сначала мне нужно получить эти строки, а затем получить цифры до того, как_ символ.

Я попробовал этот тип регулярных выражений:

regexp_like(event, '^[Main/Search/[1-9]+(?=_')

Но он извлекает только такие строки, как:

Main/Search/1_

, и не извлекает строки с несколькими цифрами до _ symbol

В конце я ожидаю получить цифры перед символом _.Для значения 'Main/Search/124_mobile' это будет '124'

1 Ответ

0 голосов
/ 26 марта 2019

То, что вы ищете, это:

SELECT REGEXP_REPLACE(event, '.*\/(\d+)\_.*', '\1')

Прежде всего, я считаю, что с функциями Vertica RegEx лучше использовать \d (сокращение от цифр) вместо \[0-9] для числасоответствие.

Шаблон .*\/(\d+)\_.* соответствует всему значению event, но поскольку \d+ заключен в круглые скобки, он становится первой захваченной группой, которая представлена ​​как обратная косая черта 1 \1 варгумент замены, так что, хотя все значения в event совпадают, будет отображаться только первая группа \1.

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

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

SELECT REGEXP_REPLACE(event, '.*\/(\d+)\_.*', '\1')
FROM table
WHERE REGEXP_LIKE(event, '.*\/\d+\_.*');

Для получения дополнительной информации см. последний пример (тот, что внизу о телефонных номерах) на этой странице.в документации: https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/RegularExpressions/REGEXP_REPLACE.htm

...