使用正则表达式从文本中提取带有和不带有自定义 URL 方案的 URL

Extract URL with and without custom URL schemes from text using RegEx

我正在寻找一种使用 RegEx 从文本中提取 URLs 的方法。 SF 上有很多问题和非常好的答案,但我没有找到能够提取 URLs 以及自定义方案的 RegEx 解决方案。

这里有几个例子,我需要从中提取 URLs:

Text: Send me a message on whatsapp whatsapp://send?text=Hello+World. I will get in touch!
-> Should extract whatsapp://send?text=Hello+World

Text: Some text google.com
-> Should extract google.com

Text: There are many nice people on https://www.whosebug.com
-> Should extract https://www.whosebug.com

Text: You can send visit my Facebook profile on fb://myhappyprofile. 
-> Should extract fb://myhappyprofile

Text: https://www.google.com
-> Should extract https://www.google.com

目前我发现的解决方案明确提取了 URLs 以 http:// https://://。在这些解决方案中,必须在表达式中指定协议。

我得到最多结果的表达式是以下表达式:

(http|ftp|https|whatsapp|fb):\/\/([\w_-]+(?:(?:\.[\w_-]+)?))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

Live Demo

我在这里列出了 URL 方案 ("deep links") 到 WhatsApp 和 Facebook 等应用程序。 不幸的是,这并不能很好地扩展。

如有任何帮助,我们将不胜感激!

如果我没看错的话,你想要的是有一种通用的方法来检测用于 URL 的协议,这样你就不需要维护一个包含 100 个不同协议的列表?

如果是这样,那么用标准字符捕获替换您的协议列表应该可以完成工作。

假设:

  • URLs 将始终包含“://”以将协议与位置分开
  • 协议最少包含 2 个字符,最多包含 20 个字符(但您可以根据自己的要求进行调整

这意味着以下内容应该可以完成工作

([a-zA-Z]{2,20}):\/\/([\w_-]+(?:(?:\.[\w_-]+)?))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

https://regex101.com/r/epzXQv/2