如何在redshift(或替代)中使用正则表达式捕获组

时间:2018-06-06 00:45:15

标签: sql regex amazon-redshift

我在红移列中有一个字段如下所示:

abcd1234df-TEXT_I-WANT

前10位数字和数字可以是字母或数字。

如果我使用捕获组正则表达式,我会使用写得不好的表达式(\w\w\w\w\w\w\w\w\w\w\W)(.*)和grap第二组

但是我在红移中遇到这个问题时遇到了麻烦,所以不确定在第一个连字符之后我怎么才能抓住这些东西

5 个答案:

答案 0 :(得分:5)

如前所述,正则表达式可能是一种矫枉过正。但是,它在某些情况下可能有用。

这是一个基本的replace模式:

int main(){
int tab[5]={10, 20, 30, 40, 50};
int *ptr;
ptr=tab+4;
printf("%d,%#x,%#x. \n",*ptr-1,&tab,ptr);
return 0;}

答案 1 :(得分:3)

正则表达式可能过度。基本字符串操作足够好:

select substring(col from position('-' in col) + 1)

答案 2 :(得分:1)

可以使用charindexsubstring完成此操作。

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

答案 3 :(得分:0)

您可以使用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  

答案 4 :(得分:0)

@ wp78de为使用REGEX_REPLACE提供了很好的建议。我允许您选择捕获组。使用您的正则表达式看起来像那样,尽管您在这里不需要2个组,在这里使用1个组就足够了。

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_SUBSTRe参数集(使用子表达式提取子字符串)。它允许您选择一个子字符串,但只能仅在正则表达式中的第一个捕获组。您还必须将 position occurrence 参数设置为默认的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
  );