Redshift中的REGEXP_SUBSTR函数未返回期望值

时间:2019-11-20 07:34:58

标签: regex amazon-redshift

我有一个带有URL列的表。我正在尝试使用Redshift中的REGEX_SUBSTR函数提取URL的不同部分。

URL                                             Expected_output
------------                                 
www.abcd.com/first-name                      |   first-name
www.abcd.com/another-name/some-details/other |   another-name
www3.abcd.com/some-name/                     |   some-name
form.abcd.com/another-first-name             |   another-first-name

所以目的是提取域名之后的第一个子段

我尝试了
SELECT REGEXP_SUBSTR('www.abcd.com/slug-name', '(www|www3|form)[.]abcd[.][^/]+/([^/#?]+)',1,2)

输出
www.abcd.com/slug-name

2 个答案:

答案 0 :(得分:1)

由于模式中需要几个分组,第一个分组定义了预期的匹配上下文(因此,您无需提取第一组内容),并且REGEXP_SUBSTR仅支持使用{ {1}}修饰符,您必须退回到e

一个音符:REGEXP_REPLACE除去匹配项,如果字符串不匹配,它将保持原样。 REGEXP_REPLACE将返回空白值。

所以,您可以考虑

REGEXP_SUBSTR

或者,要删除“不匹配条目”文本(请注意在末尾添加的REGEXP_REPLACE('www.abcd.com/slug-name', '^(www3?|form)\\.abcd\\.[^/]+/([^/#?]+).*', '$2')

|.+

因此,REGEXP_REPLACE('www.abcd.com/slug-name', '^(www3?|form)\\.abcd\\.[^/]+/([^/#?]+).*|.+', '$2') 个匹配项

  • ^(www3?|form)\\.abcd\\.[^/]+/([^/#?]+).*-字符串的开头
  • ^-第1组:(www3?|form)和可选的www
  • 3-\.abcd\.子字符串
  • .abcd.-除[^/]+以外的1个以上的字符
  • /-一个/字符
  • /-第2组(在替换模式中通过([^/#?]+)后向引用进行引用):除$2/和{{1} }
  • #-尽可能多0个字符

?说“或任何1个以上的字符”。也就是说,如果第一个替代项没有找到匹配项,则删除整个文本。

答案 1 :(得分:-1)

您可以忽略直到第一个正斜杠的所有内容,捕获在第一个正斜杠之后至第二个斜杠(如果存在)之前的组。在捕获组中,您想要获取包含字符(可能不是大写),连字符和下划线的任何内容。我发现'\ w-'匹配下划线和连字符。

尝试以下表达式:

^.*?\/([\w-]+)\/?.*

我在以下字符串上对此进行了测试:

www.abcd.com/first-name                     
www.abcd.com/another-name/some-details/other 
www3.abcd.com/some-name/                    
form.abcd.com/another-first-name
form.abcd.com/another_first-name
form.abcd.com/anotherfirst-name

然后我用tool on Regex 101给了我这些匹配项:

Match 1
Full match  0-44    www.abcd.com/first-name                     
Group 1.    13-23   first-name
Match 2
Full match  45-90   www.abcd.com/another-name/some-details/other 
Group 1.    58-70   another-name
Match 3
Full match  91-135  www3.abcd.com/some-name/                    
Group 1.    105-114 some-name
Match 4
Full match  136-168 form.abcd.com/another-first-name
Group 1.    150-168 another-first-name
Match 5
Full match  169-201 form.abcd.com/another_first-name
Group 1.    183-201 another_first-name
Match 6
Full match  202-233 form.abcd.com/anotherfirst-name
Group 1.    216-233 anotherfirst-name