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

Posted

技术标签:

【中文标题】正则表达式:替换网址的最后一段【英文标题】:Regex: Replace last segment of url 【发布时间】:2022-01-22 11:54:51 【问题描述】:

我试图找出正确的正则表达式,用最后一段的修改版本替换网址的最后一段。 (我知道那里有类似的线程,但似乎没有任何帮助......)

例子:

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=$2`)
  return path

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

我会很高兴在这里得到任何帮助。有时我只是不了解正则表达式的可能性以及如何实现它。

提前谢谢你。

干杯

【问题讨论】:

【参考方案1】:

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

然后,您可以将路径名的最后一部分放在一个组中,并将其用作参考 $1 进行替换。

const url = new URL('https://www.test.com/one/two/three/mypost/').pathname.substring(1)

console.log(url.replace(/\/([^/]*)\/$/, '?id=$1'))

【讨论】:

【参考方案2】:

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

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

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

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

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

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

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

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

\/? 可选斜杠

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

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

【讨论】:

24 小时。哈哈。好的。非常感谢您详尽的回答!我认为当我下次偶然发现正则表达式时,这将对我未来的某个地方有所帮助;)。

以上是关于正则表达式:替换网址的最后一段的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式(sedawk)

java正则表达式提取网址

正则表达式替换但忽略最后一个字符

关于正则表达式的入门心得

正则表达式匹配一段里的第一个空格?

正则表达式re.sub替换不完整的问题现象及其根本原因