4

我目前正在学习正则表达式,我正在尝试使用notepad++从文档中过滤所有链接(例如: http ://www.link.com/folder/file.html) 。实际上,我想删除其他所有内容,以便最后只列出 http 链接。

到目前为止,我试过这个:http\:\/\/www\.[a-zA-Z0-9\.\/\-]+

这给了我所有找到的链接,但是我如何删除剩余的东西,以便最后我有一个所有链接的整洁列表?

如果我尝试用 \1 之后的任何内容替换它,显然链接将被删除,但我希望完全相反,删除所有其他内容。

所以它应该是这样的: - 找到一串数字,字母和特殊符号,直到“http” - 删除你找到的东西 - 并在“html”之后继续搜索更多的数字,字母和特殊符号 - 并再次删除它

有任何想法吗?非常感谢。

4

5 回答 5

12

在 Notepad++ 中,在替换菜单 (CTRL+H) 中,您可以执行以下操作:

  • 寻找:.*?(http\:\/\/www\.[a-zA-Z0-9\.\/\-]+)
  • 代替:$1\n
  • 选项:检查Regular expression. matches newline

这将为您返回所有链接的列表。不过有两个问题:

  1. 您为匹配 URL 提供的正则表达式远不足以匹配任何 URL。如果它在你的情况下工作,那很好,否则检查这个问题
  2. 它将保留最后一个匹配的 URL 之后的文本不变。您必须手动删除它。
于 2013-11-01T00:12:17.440 回答
0

不幸的是,这个看似简单的任务在 notepad++ 中几乎是不可能完成的。您必须构建的正则表达式将是......可怕的。这甚至可能是不可能的,但如果是的话,那就不值得了。我几乎可以保证。

然而,一切都没有丢失。还有其他工具更适合这个问题。

您真正想要的是一个可以搜索输入文件并打印出正则表达式匹配列表的工具。UNIX 实用程序“grep”就可以做到这一点。不要害怕,因为它是一个 UNIX 实用程序:您可以在 Windows 上获得它:

http://gnuwin32.sourceforge.net/packages/grep.htm

您要使用的 grep 命令行是这样的:

grep -o 'http:\/\/www.[a-zA-Z0-9./-]\+\?' <filename(s)>

(您要在其中搜索 URL 的文件的名称在哪里<filename(s)>。)

您可能也想稍微改变一下您的正则表达式。我在该正则表达式中看到的问题是它无法处理没有“www”子域的 URL,并且它不会处理安全链接(以 开头https)。也许这就是你想要的,但如果不是,我会这样修改它:

grep -o 'https\?:\/\/[a-zA-Z0-9./-]\+\?' <filename(s)>

以下是关于这些表达式的一些注意事项:

  1. [在字符组内,除了and (sometimes)之外,不需要引用元字符-。我有时会说,因为如果你把破折号放在最后,就像我上面所说的,它不再被解释为范围运算符。

  2. 令人讨厌的是,grep 实用程序的语法与大多数正则表达式实现不同,因为我们熟悉的大多数元字符 ( ?,+等) 必须转义才能使用,而不是相反。这就是为什么您在上面的?+字符之前看到反斜杠的原因。

  3. 最后,这个表达式 ( +) 中的重复元字符默认是贪婪的,这可能会导致问题。我通过附加 a 使它变得懒惰?。您制定 URL 匹配的方式可能不会导致问题,但是如果您将匹配更改为,例如,[^ ]而不是[a-zA-Z0-9./-],您会看到同一行上的 URL 组合在一起。

于 2013-10-31T22:00:02.837 回答
0

当我想要执行类似的过程时,@psxls之前的回答对我有很大帮助。

然而,这条regex规则是六年前写的:因此,我不得不调整/完成/更新它,以便它可以与最近的一些链接正常工作,因为:

  1. 现在很多 URL 都在使用HTTPS而不是HTTP协议
  2. 许多网站较少www用作主要子域
  3. 一些链接添加了标点符号(必须保留)

我终于重新调整了搜索规则,.*?(https?\:\/\/[a-zA-Z0-9[:punct:]]+)并且它与我拥有的文件一起正常工作。

于 2019-02-21T15:00:49.020 回答
0

我以不同的方式做到了这一点。
查找直到第一个/下一个(https 或 http)(然后是接下来的所有内容)直到(html 或 htm)的所有内容,然后仅输出“(https 或 http)(接下来的所有内容)然后(html 或 htm)”每个后换行/回车。

所以:
查找:.*?(https:|http:)(.*?)(html|htm)
替换为:\1\2\3\r\n

节省寻找所有可能的(包括非通用的)网址匹配。

您需要手动删除最后匹配的 URL 之后的所有文本。

也可用于创建 url 链接:
查找:.*?(https:|http:)(.*?)(html|htm)
替换:<a href="\1\2\3">\1\2\3</a>\r\n

或图片链接(jpg/jpeg/gif):
查找:.*?(https:|http:)(.*?)(jpeg|jpg|gif)
替换:<img src="\1\2\3">\r\n

于 2019-05-03T16:23:16.087 回答
0

我知道我的答案不会与 RegEx 相关,但这是另一种获取包含 URL 的行的有效方法。这不会删除评论中提到的 Toto 等链接周围的文本。

至少如果所有链接都有很好的模式,比如https://.

  1. CTRL+F => 将选项卡更改为Mark
  2. 插入https://
  3. 打勾Mark to bookmark
  4. Mark All.
  5. Find=> Bookmarks=> Delete all lines without bookmark

我希望在这里寻找同样问题的人会发现我的方式更加用户友好。

您仍然可以使用 RegEx 来标记行:)

于 2021-03-22T16:41:31.907 回答