С помощью 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+)'
у нас есть следующие подгруппы:
'([a-zA-Z]\w+)'
'(@)'
'(\w+)'
'(\.)'
'(\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 |
Спасибо всем за помощь!
Если он недокументирован, то он также не поддерживается. Я бы подумал о том, чтобы начать с корня проблемы (извлечение данных из строк) и начать снова.
REGEXP_SUBSTR_GPL(источник, шаблон, 1, 1, 'i', 1) отличается только последним целым числом, и это указывает, какую группу он должен принимать. см. здесь coderhelper.com/questions/49619100/regexp-substr-in-teradata
Спасибо, это полезно! Чтобы было ясно, является ли группа захвата группировкой внутри самого выражения регулярного выражения? Я немного погуглил и нашел возможный пример: '[a-zA-Z]\w+@\w+\.\w+' делится как ([a-zA-Z]\w+)(@)(\w+)( \.)(\w+) на пять групп 1. ([a-zA-Z]\w+) 2. (@) 3. (\w+) 4. (\.) 5.0 (\w+)
В остальном я разобрался. Я сам выложил ответ, если кому-то интересно его увидеть. Спасибо за вашу помощь всем!