正则表达式 - 还提取带有 www 的 URL

Posted

技术标签:

【中文标题】正则表达式 - 还提取带有 www 的 URL【英文标题】:Regex - Extract also URLs with www 【发布时间】:2021-04-16 15:22:44 【问题描述】:

我使用这个正则表达式来查找 URL:

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

问题是,它没有找到以 www 开头的网址。

我该如何解决这个问题?

这是我需要从中提取网址的数据source。

【问题讨论】:

您能否提供输入有效和无效输入的示例。换句话说,一些预期的输入和输出 一切以 http、ftp、https 开头的东西都有效。例如这有效:w3.org/2005/Atom 但这不起作用:www.w3.org/2005/Atom @maytham-ɯɐɥʇʎɐɯ 这是文本:controlc.com/91acc839 试试你的代码,你会看到它出于某种原因提取了数字。在线试用:regex101.com 【参考方案1】:

此答案基于您在评论中附带的提供 xml 文件。

您的文件有几个问题,除了以 https、http 和 www 开头之外,它还包含以 download.somedomain.com、marketplace.somedmain.com 开头的 url,因此它是不一致的。另一个问题是 url 的结尾可以以 ., 结尾,它在 url 结束后没有空格,也没有模式可以逐行或逐块遍历它。

最后一件事它包含重复。

我选择解决的方式,将正则表达式分成两部分:

一部分取所有以有效 url 开头的 url,而不看它的结尾。 第二部分负责处理第一部分剩余内容的有效 url。 关于重复项,我为此使用了 hashset。 该解决方案不考虑 xml 中的特定标签或特定包含,它只关心内容中的 url。

解决办法如下:

HashSet<string> urls = new HashSet<string>();

var beginWith = new Regex(@"\b(?:(http|ftp|https)?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
foreach (Match item in beginWith.Matches(input))

    var endWith = new Regex(@"([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?");

    foreach (Match url in endWith.Matches(item.ToString()))
    
        urls.Add(url.ToString());
    

这里的代码确实可以减少和改进。我把它留给你的幻想。

这是文件的最终和前 5 个 url 输出:

www.w3.org/2005/Atom
marketplace.xboxlive.com/resource/product/v1
www.xbox.com/live/accounts
download.xbox.com/content/images/66acd000-77fe-1000-9115-d802534307d4/1033/boxartlg.jpg
download.xbox.com/content/images/66acd000-77fe-1000-9115-d802534307d4/1033/boxartsm.jpg
etc.....

【讨论】:

我以前试过这个。是的,它抓住了www。链接,还可以从我的文件中提取数字。这是我正在提取的文件:pastebin.com/Z2LSZtdn【参考方案2】:

好吧,只要检查你的字符串是否包含“https://”或“http://”,如果没有,请在开头添加 https:// ^^

        string url = "";

        if (!url.Contains("https://") || !url.Contains("http://"))
        
            url.Insert(0, "https://");
        

【讨论】:

以上是关于正则表达式 - 还提取带有 www 的 URL的主要内容,如果未能解决你的问题,请参考以下文章

带有变量的 Django URL 正则表达式

使用正则表达式从 url 中提取参数值

使用正则表达式从 url 中提取参数值

如何使用正则表达式从字符串中提取第 n 个 URL?

使用 Java + 正则表达式从文本文档中提取 URL

如何使用 python/django 从字符串中提取 url?(使用正则表达式)