正则表达式:替换 url 的最后一段

Regex: Replace last segment of url

我试图找出正确的正则表达式,用最后一段的修改版本替换 url 的最后一段。 (我知道那里有类似的帖子,但 none 似乎有帮助...)

示例:

https://www.test.com/one/two/three/mypost/
--->
one/two/three?id=mypost


https://www.test.com/one/mypost/
--->
one?id=mypost

现在我被困在这里: https://regex101.com/r/9GqYaU/1

我可以获取捕获组 2 中的最后一段,但我该如何替换它? 我想我将不得不这样做:

  const url = 'https://www.test.com/one/two/three/mypost/'
  const regex = /(http[s]?:\/\/)([^\/]+\/)*(?=\/$|$)/
  const path = url.replace(regex, `${myUrlWithoutTheLastSegmentAnd WithoutHTTPS}?id=`)
  return path

但我不知道如何在没有最后一段的情况下获得 url。我目前只能访问整个字符串或第 1 组(在这种情况下无用),然后是第 2 组,但不能访问没有第 2 组的字符串。

我很乐意在这里提供任何帮助。有时我只是不了解正则表达式的可能性以及如何实现它。

提前谢谢你。

干杯

您可以使用 URL class 提取路径名并使用 substring 删除第一个“/”。

然后,您可以将路径名的最后一部分放在一个组中,并将其用作替换的参考</code>。</p> <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code"> <pre><code>const url = new URL('https://www.test.com/one/two/three/mypost/').pathname.substring(1) console.log(url.replace(/\/([^/]*)\/$/, '?id='))

我昨天遇到了你的问题,同意沿着解析 URL 的路线前进。一旦你到达那里,你甚至可以使用 JavaScript 数组方法,我更喜欢像这样的字符串方法:

pathname.split("/").filter(p => p.length).pop()

这将分隔每个文件夹,忽略任何没有长度的文件夹(即处理尾部斜杠)和 return 最后一个文件夹 (mypost)。

无论如何,我也在学习正则表达式,所以有时当我发现这样的问题时,我只是试图找到答案,因为最好的学习方式就是这样做。我花了 24 小时想出了这个:

/(https?:\/\/).+?([a-z-]*)\/?$/gm

(https?:\/\/) 你知道这是做什么的。小更正,您不需要方括号。问号匹配前面字符的 0 或 1。因为我们只匹配 s 这才有效。如果你想匹配 s 或 z,你可以使用 [sz]?。我觉得。

.+?这是我认为我将来会用到的很酷的一个,现在我找到了。这里的问号有不同的含义 - 它使 .+(这意味着任何字符中的一个或多个)非贪婪。这意味着一旦达到下一条规则,它就会停止应用。这是...

([a-z-]*) 任意数量的字母或连字符。您也许应该将其更改为包含数字和大写字母。

\/? 可选斜杠

$ 所有这些都必须应用在字符串的末尾。

这是一个演示 https://regex101.com/r/mQNkIS/1