如何使用postgres函数regexp_replace从URL到端口号获得结果?

时间:2018-04-18 11:21:24

标签: regex postgresql regex-group

我需要你的帮助来使用Postgres DB的regexp_replce函数从给定的字符串中获取子字符串。

我正在尝试以下查询,

select regexp_replace('http://localhost:8080/redirectHome?abc=xyz&sortBy=111', '(.*?/){3}', '');

但它给我错误的结果或意外的结果。

预期结果为:http://localhost:8080

我的疑问是,我在regex地方或其他地方向regex_replace函数提供了错误的输入。

2 个答案:

答案 0 :(得分:2)

您可以从字符串的开头匹配3个/个分隔的块序列,捕获该部分,然后匹配其余字符串以将其删除:

select regexp_replace('http://localhost:8080/redirectHome?abc=xyz&sortBy=111', '^([^/]*(?:/[^/]*){2}).*', '\1');

在这里,

  • ^ - 字符串开头
  • ([^/]*(?:/[^/]*){2}) - 第1组(后来用替换模式中的\1占位符引用):
    • [^/]* - 除/
    • 以外的任何0 +字符
    • (?:/[^/]*){2} - 连续2次出现:
      • / - 斜线
      • [^/]* - 除/
      • 以外的任何0 +字符
  • .* - 尽可能多的0个字符
  • \1 - 占位符,将第1组中捕获的文本插回到结果字符串中。

或者,在第4 /之前提取文字:

select regexp_matches('http://localhost:8080/redirectHome?abc=xyz&sortBy=111', '^[^/]*(?:/[^/]*){2}');

此处,^[^/]*(?:/[^/]*){2}匹配除/以外的前0个字符,然后匹配2次出现/,然后匹配除/以外的其他0 +字符。

请参阅online demo

enter image description here

答案 1 :(得分:0)

我在上面看到了详细的答案,但这里有一个不同的答案。它只花了9个步骤

/^([^\d]*)([\d]*)/

第一个捕获组在端口号

之前从头到尾捕获所有内容

,第二个捕获组捕获端口号

https://regex101.com/r/h9xHl3/1/