正则表达式 - 还提取带有 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\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?");
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的主要内容,如果未能解决你的问题,请参考以下文章