【问题标题】:RegEx filter links from a document正则表达式过滤文档中的链接
【发布时间】:2013-10-31 21:40:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 将链接复制到另一个文件怎么样?
  • 我能够用纯正则表达式提出的最佳解决方案是将每个链接隔离到自己的行上,尽管它也将字符串的结尾(例如:链接后的任何文本放在末尾一行)在自己的行上。
  • 你会怎么做?

标签: regex notepad++


【解决方案1】:

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

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

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

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

【讨论】:

  • 在我的情况下,匹配 url 的正则表达式很好,但是你的 .*?由于某种原因不起作用。而且我不知道为什么,但其余的只会用 $1 替换 url...!?
  • 再次检查 1) 您确实检查了“正则表达式”单选按钮,2) 您拥有最新版本的 Notepad++,现在是 v6.5(至少不低于 v6.0)和让我知道。
  • 目前我在使用 TextWrangler 的 Mac 上,以后可以检查 notepad++。至少 text wrangler 只是用 $1 替换了整个链接,除了结束标签的最后一部分 > 之外。
  • 现在在 notepad++ 中的 Windows 上进行了检查,它可以工作了!非常感谢。这让我很头疼。有人可以用一句话解释为什么正则表达式在 notepad++ 中有效,但在其他编辑器中无效?
  • 他们都使用相同的正则表达式引擎(PCRE),所以理论上它也应该在 TextWrangler 上工作。您是否在 TextWrangler 中检查了等效的“.matches newline”选项?不幸的是,我无法在 TW 上对其进行测试。
【解决方案2】:

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

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

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

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

您要使用的 grep 命令行如下:

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

(其中&lt;filename(s)&gt; 是您要在其中搜索 URL 的文件的名称。)

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

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

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

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

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

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

【讨论】:

  • 如果我切换到 Mac 会怎样。我知道 Textwrangler 应该使用 grep,对吗?还是一样的命令吗?
  • 是的,此命令将在大多数 Mac 的控制台中可用,您无需安装任何东西。
  • 但我仍然不知道如何删除除链接之外的所有内容?
  • 好吧,除了链接之外,它不会删除所有内容:它只会输出链接,完成同样的事情。只需将其重定向到一个文件(以 ` > output.txt` 结束命令),您将拥有一个仅包含链接的文本文件。
  • 如果您尝试转换 HTML 文档,情况会稍有不同……但这仍然是一个不错的起点。
【解决方案3】:

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

但是,这条regex 规则是六年前写的:因此,我必须调整/完成/更新它才能正确处理一些最近的链接,因为:

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

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

【讨论】:

    【解决方案4】:

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

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

    保存查找所有可能的(包括非通用)url 匹配项。

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

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

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

    【讨论】:

    • 只有一个就足够了,为什么还要使用 3 个捕获组? \1 替换符号是非常古老的语法,最好使用$1\1 用于正则表达式中的反向引用。 (https:|http:) 更好写(https?:) (html|htm) 相同 --> (html?)
    • 你是对的,谢谢。很久以前,我在看这个。查找:.*?(https?:.*?html?) 替换:$1\r\n
    【解决方案5】:

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

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

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

    我希望来这里寻找相同问题的人会发现我的方式对用户更友好。

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

    【讨论】:

    • 这不会根据需要删除链接周围的文字。
    • @Toto 对于这种情况,我会推荐任何在线“链接提取器”。 Browseling - 喜欢这个,但向解决方案添加另一个工具并不总是受欢迎的解决方案。但如果它有效,它就是一个解决方案,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多