用于清理 Vim 中的 Google 链接的正确正则表达式模式是什么?

What is the correct regex pattern to use to clean up Google links in Vim?

如您所知,Google 链接可能非常笨重:

https://www.google.com/search?q=some+search+here&source=hp&newwindow=1&ei=A_23ssOllsUx&oq=some+se....

我保存了 许多 Google 个链接,我想清理这些链接,使它们看起来像这样:

https://www.google.com/search?q=some+search+here

唯一的问题是我无法找到 Vim 执行此操作的正确正则表达式模式。

我想它一定是这样的:

:%s/&source=[^&].*//

:%s/&source=[^&].*[^&]//

:%s/&source=.*[^&]//

但是其中 none 个在工作;它们从 &source 开始,并替换到行尾。

另外,search?q=some+search+here 可以出现在 .com/ 之后的任何地方,所以我不能指望它每次都出现在同一个地方。

那么,为了清理这些链接,正确的 Vim 正则表达式模式是什么?

您的示例可以使用非常简单的模式轻松处理:

:%s/&.*

因为您想保留第二个参数之前的所有内容,该参数由字符串中的第一个 & 标记。

但是,如果 q 参数可以在查询字符串中的任何位置,如:

https://www.google.com/search?source=hp&newwindow=1&q=some+search+here&ei=A_23ssOllsUx&oq=some+se....

那么再多的捕获或诸如此类的东西都不足以用单一模式涵盖所有可能的情况,更不用说可读的模式了。在这一点上,脚本确实是唯一合理的方法,最好使用能够理解 URLs.

的语言

--- 编辑 ---

嗯,从头开始。以下似乎适用于所有领域:

:%s@^\(https://www.google.com/search?\)\(.*\)\(q=.\{-}\)&.*@
  • 我们使用 @ 作为分隔符,因为在典型的 URL.
  • 中有很多 /
  • 我们捕获第一组,直到并包括标记查询字符串开头的 ?
  • 我们匹配 ? 和第一次出现的 q= 之间的任何内容,而不捕获它。
  • 我们捕获第二组,即 q 参数,直到并排除下一个 &
  • 我们将整个内容替换为第一个捕获组,然后是第二个捕获组。