我需要你的帮助来使用Postgres DB的regexp_replce
函数从给定的字符串中获取子字符串。
我正在尝试以下查询,
select regexp_replace('http://localhost:8080/redirectHome?abc=xyz&sortBy=111', '(.*?/){3}', '');
但它给我错误的结果或意外的结果。
预期结果为:http://localhost:8080
我的疑问是,我在regex
地方或其他地方向regex_replace
函数提供了错误的输入。
答案 0 :(得分:2)
您可以从字符串的开头匹配3个/
个分隔的块序列,捕获该部分,然后匹配其余字符串以将其删除:
select regexp_replace('http://localhost:8080/redirectHome?abc=xyz&sortBy=111', '^([^/]*(?:/[^/]*){2}).*', '\1');
在这里,
^
- 字符串开头([^/]*(?:/[^/]*){2})
- 第1组(后来用替换模式中的\1
占位符引用):
[^/]*
- 除/
(?:/[^/]*){2}
- 连续2次出现:
/
- 斜线[^/]*
- 除/
.*
- 尽可能多的0个字符\1
- 占位符,将第1组中捕获的文本插回到结果字符串中。或者,在第4 /
之前提取文字:
select regexp_matches('http://localhost:8080/redirectHome?abc=xyz&sortBy=111', '^[^/]*(?:/[^/]*){2}');
此处,^[^/]*(?:/[^/]*){2}
匹配除/
以外的前0个字符,然后匹配2次出现/
,然后匹配除/
以外的其他0 +字符。
请参阅online demo:
答案 1 :(得分:0)
我在上面看到了详细的答案,但这里有一个不同的答案。它只花了9个步骤
/^([^\d]*)([\d]*)/
第一个捕获组在端口号
之前从头到尾捕获所有内容,第二个捕获组捕获端口号