我有一个带有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
答案 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