Как использовать группу захвата регулярных выражений в красном смещении (или альтернативе) - PullRequest
0 голосов
/ 06 июня 2018

У меня есть поле в столбце красного смещения, которое выглядит следующим образом:

abcd1234df-TEXT_I-WANT

символы и цифры в первых 10 цифрах могут быть буквами или цифрами.

Если бы я использовал регулярное выражение группы захвата, я использовал бы плохо написанное выражение, такое как (\w\w\w\w\w\w\w\w\w\w\W)(.*), и взял бы вторую группу

Но у меня возникают проблемы с реализацией этого в красном смещении, поэтому не уверенкак я могу взять только вещи после первого дефиса

Ответы [ 5 ]

0 голосов
/ 22 февраля 2019

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

select 
  regexp_replace(
    'abcd1234df-TEXT_I-WANT',
    '(\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\W)(.*)', 
    '$2' -- replacement selecting 2nd capture group
  );

Другой вариант, хотя и менее гибкий, использует REGEX_SUBSTR с набором параметров e ( Извлечение подстроки с помощью подвыражения ).Это позволяет вам выбрать подстроку, но только из первой группы захвата в вашем регулярном выражении.Вы также должны установить параметры position и occurence по умолчанию 1:

Используя предложенный вами REGEX, но только с 1 группой:

select 
  regexp_substr(
    'abcd1234df-TEXT_I-WANT',
    '\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\W(.*)', 
    1, -- position
    1, -- occurrence
    'e' -- parameters
  );
0 голосов
/ 06 июня 2018

Вы можете получить желаемую строку, используя общее табличное выражение с regexp_substr, как показано ниже:

with cte as
(
 select 'abcd1234df-TEXT_I-WANT' as str   
)    
select regexp_substr(str,'-.*') 
       as derived_str
  from cte;

derived_str
-------------
-TEXT_I-WANT  
0 голосов
/ 06 июня 2018

Регулярные выражения могут быть излишними.Основные строковые операции достаточно хороши:

select substring(col from position('-' in col) + 1)
0 голосов
/ 06 июня 2018

Как упоминалось ранее, регулярное выражение может быть излишним.Тем не менее, это может быть полезно в некоторых случаях.

Вот базовый шаблон замены :

SELECT
    regexp_replace(
      'abcd1234df-TEXT_I-WANT'  -- use your input column here instead
    , '^[a-z0-9]{10}-(.*)$'     -- matches whole string, captures "TEXT_I-WANT" in $1
    , '$1'                      -- inserts $1 to return TEXT_I-WANT
    )
;
0 голосов
/ 06 июня 2018

Это можно сделать с помощью charindex и substring.

substring(col,charindex('-',col)+1)
...