从文档中过滤链接的正则表达式

4

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

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

这给了我所有的链接,但是如何删除剩余的内容,以便最终只有一个干净的链接列表呢?

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

因此应该像这样: - 找到一串数字,字母和特殊符号直到“http” - 删除您找到的内容 - 并继续寻找在“html”之后的更多数字,字母和特殊符号 - 再次删除它们

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


1
将链接复制到另一个文件中怎么样? - LeeNeverGup
我能够想到的仅使用正则表达式的最佳解决方案是将每个链接隔离到自己的行上,但它也会将字符串的结尾(例如:在行末链接后的任何文本)放在自己的行上。 - Nightfirecat
你会怎么做? - Phillip
5个回答

12

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

  • 查找:.*?(http\:\/\/www\.[a-zA-Z0-9\.\/\-]+)
  • 替换:$1\n
  • 选项:勾选 正则表达式.匹配换行符

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

  1. 您提供的用于匹配URL的正则表达式远非通用,不能匹配任何URL。如果对您有用,则可以忽略此问题,否则请查看此问题
  2. 它会保留最后一个匹配的URL后面的文本。您必须手动删除它。

在我的情况下,用于匹配URL的正则表达式很好,但是你的.*?出了一些问题。我不知道为什么,但是其余部分只会用$1替换URL...!? - Phillip
目前我正在使用Mac上的TextWrangler,稍后可以检查notepad++。至少text wrangler只会用$1替换整个链接,除了结束标签的最后一部分>之外。 - Phillip
在Windows的notepad++中验证过,现在它可以工作了!非常感谢。它让我头疼不已。有人可以用一句话解释为什么正则表达式在notepad++中有效但在其他编辑器中无效吗? - Phillip
两者都使用相同的正则表达式引擎(PCRE),理论上在TextWrangler上也应该可以工作。你有在TextWrangler中检查等效的“.匹配换行符”选项吗?不幸的是,我无法在TW上进行测试。 - psxls
我试了但不起作用。很奇怪,因为我的一个朋友告诉我,只要我没有Windows电脑的访问权限,我就可以使用TextWrangler。无论如何,感谢帮助。我仍在寻找一种方法来搜索行中第二或第三个字母串。例如,ab ab ab,但只替换第二个“ab”为“cd”,然后跳到下一行再次执行相同操作。 - Phillip
显示剩余2条评论

1

psxls之前的回答对我非常有帮助,因为我想执行类似的过程。

然而,这个regex规则已经写了六年了:因此,我必须进行调整/完善/更新,以便它能够正确地处理一些最近的链接,因为:

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

最终,我重组了搜索规则为.*?(https?\:\/\/[a-zA-Z0-9[:punct:]]+),并且它可以正确地处理我拥有的文件。


1

我知道我的回答与正则表达式无关,但这里是另一种获取包含URL的行的有效方法。

这不会删除像Toto在评论中提到的链接周围的文本。

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

  1. CTRL + F => 切换到 标记 选项卡
  2. 插入 https://
  3. 勾选 标记为书签
  4. 全部标记
  5. 查找 => 书签 => 删除没有书签的所有行

我希望某些人在搜索相同问题时会发现我的方法更加用户友好。

您仍然可以使用正则表达式来标记行 :)


2
这将不会像预期的那样删除链接周围的文本。 - Toto
@Toto 对于这种情况,我建议使用任何在线的“链接提取器”。Browseling - 就像这个一样,但是添加另一个工具到解决方案并不总是受欢迎的解决方案。但如果它有效,那就是一个解决方案,对吧? - Fapka Master

0

不幸的是,在Notepad++中完成这个看似简单的任务几乎是不可能的。你需要构建的正则表达式会非常可怕,甚至可能不可能实现,即使可以实现,也不值得。我几乎可以保证。

然而,一切并没有失去希望。还有其他更适合解决这个问题的工具。

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

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

你需要使用的grep命令行是这个:
grep -o 'http:\/\/www.[a-zA-Z0-9./-]\+\?' <filename(s)>

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

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

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

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

  1. 在字符组内,除了 [ 和(有时)- 之外,无需引用元字符。我说有时是因为如果您将破折号放在末尾,就像我上面所做的那样,它不再被解释为范围运算符。

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

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


如果我转换到 Mac 上会怎样呢?我知道 Textwrangler 应该使用 grep,对吧?但是命令会一样吗? - Phillip
是的,在大多数 Mac 上,您无需安装任何东西即可在控制台中使用此命令。 - Ethan Brown
但我仍然不明白如何删除除链接以外的所有内容? - Phillip
好的,这并不会删除除链接以外的所有内容:它只会输出链接,从而实现相同的效果。只需将其重定向到文件(以 > output.txt 结束命令),您就可以得到一个只包含链接的文本文件。 - Ethan Brown
如果你想转换一个HTML文档,那就稍微有些不同了...但这仍然是一个很好的起点。 - Ethan Brown
如果我坚持使用TextWrangler或Notepad... 1.我如何使用正则表达式在一行中搜索直到找到“http”-在这种情况下,我可以用“nothing”替换掉http之前的所有内容。2.然后再次开始搜索HTML,直到找到下一个HTTP。 - Phillip

0

我用了一种不同的方法。
找到第一个/下一个(https或http)(然后是其后面的所有内容),直到(html或htm),然后仅输出“(https或http)(其后面的所有内容)然后(html或htm)”,每个之间都有换行符/回车。

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

这样可以避免寻找所有可能的(包括非通用的)URL匹配项。

您需要手动删除最后匹配的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


为什么使用三个捕获组,当只需要一个就足够了?\1替换符号是非常老的语法,最好使用$1\1用于正则表达式中的反向引用。(https:|http:)最好写成(https?:)(html|htm)也是一样 --> (html?) - Toto
没错,谢谢。我很久以前就看过这个了。查找:.?(https?:.?html?) 替换:$1\r\n - Jem V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接