正则表达式:替换网址的最后一段
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 小时。哈哈。好的。非常感谢您详尽的回答!我认为当我下次偶然发现正则表达式时,这将对我未来的某个地方有所帮助;)。以上是关于正则表达式:替换网址的最后一段的主要内容,如果未能解决你的问题,请参考以下文章