RegEx过滤文档的链接

时间:2013-10-31 21:40:37

标签: regex notepad++

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

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

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

如果我尝试将其替换为没有后跟\ 1的内容,显然链接将被删除,但我想要完全相反的是删除其他所有内容。

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

有什么想法吗?非常感谢。

5 个答案:

答案 0 :(得分:11)

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

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

这将返回您所有链接的列表。但是有两个问题:

  1. 您为匹配网址提供的正则表达式远非足以匹配任何网址。如果它适用于您的情况,那很好,否则请检查question
  2. 它将保留最后匹配的URL完整后的文本。你必须手动删除它。

答案 1 :(得分:1)

我知道我的答案与 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 来标记行:)

答案 2 :(得分:0)

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

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

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

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

您要使用的grep命令行是:

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

(其中<filename(s)>是您要在其中搜索网址的文件的名称。)

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

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

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

  1. 在字符组中,除了[和(有时)-之外,不需要引用元字符。我有时会说,因为如果你把破折号放在最后,正如我上面所说,它不再被解释为范围操作符。

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

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

答案 3 :(得分:0)

当我想执行类似的过程时,@ psxls的answer made previously对我有很大的帮助。

但是,这个regex规则是六年前写的:因此,为了使其能够正确使用最近的一些链接,我不得不调整/完成/更新

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

我终于将搜索规则重新排列为.*?(https?\:\/\/[a-zA-Z0-9[:punct:]]+),它可以与我拥有的文件正常工作。

答案 4 :(得分:0)

我以不同的方式做到了。
查找直到(html或htm)的第一个/下一个(https或http)(然后是接下来的所有内容)的所有内容,然后仅输出'((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