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

how to get result from URL upto port number using postgres function regexp_replace?

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

我正在尝试以下查询,

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

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

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

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

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

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

这里,

  • ^ - 字符串开头
  • ([^/]*(?:/[^/]*){2}) - 第 1 组(稍后用替换模式中的 </code> 占位符引用): <ul> <li><code>[^/]* - /
  • 以外的任何 0+ 个字符
  • (?:/[^/]*){2} - 连续出现 2 次:
    • / - 斜杠
    • [^/]* - /
    • 以外的任何 0+ 个字符
  • .* - 尽可能多的任意 0+ 个字符
  • </code> - 将第 1 组中捕获的文本插入到结果字符串中的占位符。</li> </ul> <p>或者,在第 4 个 <code>/ 之前提取文本:

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

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

    参见online demo

  • 我看到上面的详细答案,但这里有一些不同的答案。仅需9步

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

    第一个捕获组捕获从最开始到端口号之前的所有内容

    第二个捕获组捕获端口号

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