REGEXP_SUBSTR_GPL отсутствует в списке, и мне неясно, какие параметры она принимает. Почему вы используете его вместо REGEXP_SUBSTR?

avatar
TheTreeMan
8 августа 2021 в 22:39
104
1
0

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

В основном они опираются на петлю:

WHEN (WHEN REGEXP_INSTR(source, pattern, 1, 1, 0 , 'i')(INT)) > 0
THEN
    (REGEXP_SUBSTR_GPL(source, pattern, 1, 1, 'i', 1) (FLOAT))

Я пытаюсь понять, что это делает, но не понимаю, как работает REGEX_SUBSTR_GPL. Я попытался найти его, и он, по-видимому, недокументирован. Я новичок в MySQL, поэтому мне было интересно, может ли кто-нибудь помочь мне понять, что он делает, и почему кто-то будет использовать его поверх REGEXP_SUBSTR().

.

Кроме того, есть ли в MySQL команда, которая позволила бы мне найти больше информации о подобных функциях и больше информации о том, какие параметры они принимают?

Спасибо.

Источник
Tangentially Perpendicular
8 августа 2021 в 22:55
0

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

nbk
8 августа 2021 в 23:04
0

REGEXP_SUBSTR_GPL(источник, шаблон, 1, 1, 'i', 1) отличается только последним целым числом, и это указывает, какую группу он должен принимать. см. здесь coderhelper.com/questions/49619100/regexp-substr-in-teradata

TheTreeMan
9 августа 2021 в 01:53
0

Спасибо, это полезно! Чтобы было ясно, является ли группа захвата группировкой внутри самого выражения регулярного выражения? Я немного погуглил и нашел возможный пример: '[a-zA-Z]\w+@\w+\.\w+' делится как ([a-zA-Z]\w+)(@)(\w+)( \.)(\w+) на пять групп 1. ([a-zA-Z]\w+) 2. (@) 3. (\w+) 4. (\.) 5.0 (\w+)

TheTreeMan
9 августа 2021 в 03:47
0

В остальном я разобрался. Я сам выложил ответ, если кому-то интересно его увидеть. Спасибо за вашу помощь всем!

Ответы (1)

avatar
TheTreeMan
9 августа 2021 в 03:45
0

С помощью nbk в комментариях у нас есть ответ!

Основной формат REGEXP_SUBSTR: REGEX_SUBSTR(source, pattern, start position, occurrence, matchOption)

Для REGEXP_SUBSTR_GPL это: REGEX_SUBSTR_GPL(source, pattern, start position, occurrence, matchOption, subexp, RETURN0)

Опция подвыражения позволяет вам вместо возврата результата всего выражения регулярного выражения выбрать, какую подгруппу вы хотели бы вернуть. Каждая подгруппа обозначается набором скобок. Итак, для '([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)' у нас есть следующие подгруппы:

  1. '([a-zA-Z]\w+)'
  2. '(@)'
  3. '(\w+)'
  4. '(\.)'
  5. '(\w+)'

Когда вы устанавливаете subexp равным 0, функция обрабатывается так же, как REGEXP_SUBSTR. Когда вы устанавливаете его равным чему-либо выше нуля, вместо этого возвращается соответствующая подгруппа, если она существует.

См. следующий пример

SELECT 'abc123@google.com' as text
,REGEXP_SUBSTR(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)', 1, 1, 'i') as REGEXP_1
,REGEXP_SUBSTR_GPL(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)',1,1,'i',0) as REGEXP_GPL_1
,REGEXP_SUBSTR_GPL(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)',1,1,'i',1) as REGEXP_GPL_2
,REGEXP_SUBSTR_GPL(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)',1,1,'i',2) as REGEXP_GPL_3
,REGEXP_SUBSTR_GPL(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)',1,1,'i',3) as REGEXP_GPL_4
,REGEXP_SUBSTR_GPL(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)',1,1,'i',4) as REGEXP_GPL_5
,REGEXP_SUBSTR_GPL(text,'([a-zA-Z]\w+)(@)(\w+)(\.)(\w+)',1,1,'i',5) as REGEXP_GPL_6

В результате получается следующий набор ответов:

текст REGEXP_1 REGEXP_GPL_1 REGEXP_GPL_2 REGEXP_GPL_3 REGEXP_GPL_4 REGEXP_GPL_5 REGEXP_GPL_6
abc123@google.com abc123@google.com abc123@google.com abc123 @ гугл . com

Спасибо всем за помощь!