本功能主要用到的知识点如下:

1、正则表达式

2、C#中下载文件功能的实现

3、泛型集合的使用

4、进程的简单操作(用于结束当前程序)

下面就简单说一下是如何使用这些知识点的。先详细说下这个程序主要实现的功能是什么,现有一个文本文件里面都是从网页上复制下来的源代码。现需要将其中的以http、https、ftp开头,以.jpg,.png,.gif开头的图片URL地址筛选出来,并去访问这些链接,将URL中所对应的图片下载下来。经过分析后。决定使用正则表达式筛选URL地址。并使用WebClient类去实现下载的功能。代码如下:

 using System.Text.RegularExpressions;
using System;
using System.Net;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
namespace URLRegex
{
class Program
{
public static List<string> getUrl(string data)
{
List<string> strUrl= new List<string>();//定义泛型,用于存放抓取的URL
string regexStr = @"(http|ftp|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)+\.(png|jpg|gif)";//查找URL的正则表达式
Regex reg = new Regex(regexStr, RegexOptions.IgnoreCase);//正则表达式的类实例化
MatchCollection mc = reg.Matches(data);//进行匹配
if (mc.Count <= )//判断没有抓取到一条合法的URL
{
Console.WriteLine("未抓取到符合条件的URL,按任意键退出程序");
Console.ReadKey();
Process.GetCurrentProcess().Kill();
}
for (int i = ; i < mc.Count; i++)
{
strUrl.Add(mc[i].Groups[].Value);//将匹配的数据装入泛型集合
}
return strUrl;//返回这个泛型集合 }//得到URL public static void downLoad(List<string> tempUrl)
{ string currentPath = System.Environment.CurrentDirectory;//得到当前目录
Directory.CreateDirectory(currentPath + @"\photos\");//在当前目录下创建photos文件夹
string currentPathPhotos = currentPath + @"\photos\";//得到photos的路径 WebClient myDownload = new WebClient();//实例化webclient类,用于下载
int i = ; //用于图片的命名
Regex regJPG = new Regex(".jpg", RegexOptions.RightToLeft);//判断图片是不是.jpg格式
Regex regPNG = new Regex(".png", RegexOptions.RightToLeft);//判断图片是不是.png格式 foreach (string temp in tempUrl)//遍历获取到的图片URL,并下载和保存
{
Match mJpg = regJPG.Match(temp);
if (mJpg.Success)
{
string filePathJpg = currentPathPhotos + i + ".jpg";
try
{
myDownload.DownloadFile(temp, filePathJpg);
Console.WriteLine("下载成功");
i++;
}
catch
{
Console.WriteLine("下载失败");
} }
else
{
Match mPng = regPNG.Match(temp); if (mPng.Success)
{
string filePathPng = currentPathPhotos + i + ".png";
try
{
myDownload.DownloadFile(temp, filePathPng);
Console.WriteLine("下载成功");
i++;
}
catch
{
Console.WriteLine("下载失败");
} }
else
{
string filePathgif = currentPathPhotos + i + ".gif";
try
{
myDownload.DownloadFile(temp, filePathgif);
Console.WriteLine("下载成功");
i++;
}
catch
{
Console.WriteLine("下载失败");
}
} } } Process.Start("explorer", currentPathPhotos);//完成后立即呈现结果
}//实现下载 public static void Main()
{
string currentPath = Environment.CurrentDirectory;
string source= File.ReadAllText(currentPath+@"\test.txt");//读入文件
List<string> temp = getUrl(source);//筛选URL
Console.WriteLine("筛选后的URL地址如下:");
foreach (string t in temp)
{
Console.WriteLine(t.ToString());//输入URL
}
Console.WriteLine("正在下载图片……");
downLoad(temp);//下载图片
Console.WriteLine("\n下载结束,按任意键退出");
Console.ReadKey();
}//主函数
}
}

难点是:

1、正则表达式的构建,因为才接触到正则表达式,所以对于其正则表达式的构建不是很熟悉,自己也在百度了查了不少的资料。也看过别人的写的一些相似的正则表达式后。才写出了这个正则表达式。

2、异常的处理。比如文件打开失败,下载失败。未得到正确的URL地址等等。(解决方案:添加上try和catch在catch中用到了当前进程的结束)。

在C#中使用正则表达式筛选出图片URL并下载图片URL中的图片到本地的更多相关文章

  1. 在没有界面的类中,实现弹出UIAlertView || 在没有界面的类中,刷新程序界面 思路

    +(DisplayErrorMsg *)sharedDisplayErrorMsg { static DisplayErrorMsg *instance = nil; @synchronized(in ...

  2. Java Springboot 根据图片链接生成图片下载链接 及 多个图片打包zip下载链接

    现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题, ...

  3. SQL Server 2008 R2——创建函数 筛选出字符串中的数字 筛选出字符串中的非数字

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  4. asp.net core 2.2 中的过滤器/筛选器(上)

    ASP.NET Core中的过滤器/筛选器 通过使用 ASP.NET Core MVC 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码. 注意:本主题不适用于 Razor 页面. ASP. ...

  5. C# 网络编程之webBrowser获取网页url和下载网页中图片

    该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试瞎子啊网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识.正则表达式实现浏览.获取url. ...

  6. groovy中的正则表达式操作符【groovy】

    groovy中对于正则表达式的书写进行了简化,同时引入了新的操作符,使得正则表达式使用起来比较方便简单. 对于书写的改进: 比如 assert "\\d" == /\d/ 也就是在 ...

  7. 关于Lab3中对于正则表达式的应用

    在这里记录一下关于软件构造课程Lab3中关于正则表达式的应用. 在实验内容中,要求用正则表达式来匹配读入文件的内容,从而取得构建图需要的相关信息. 举个例子,读入的文件(GraphPoetTestFi ...

  8. python图片爬虫 - 批量下载unsplash图片

    前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...

  9. 如何从两个List中筛选出相同的值

    问题 现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证. 转换为List socialList,和List idList,从二者中找出匹配的社保卡. 模型 创建社保卡类 /** * @a ...

随机推荐

  1. 《时间序列分析及应用:R语言》读书笔记--第一章 引论

    "春节假期是难得的读书充电的时间."--来自某boss.假期能写多少算多少,一个是题目中的这本书,另一个是<python核心编程>中的高级部分,再一个是拖着的<算 ...

  2. Service学习

    一.采用startService方式开启服务 1.写一个服务类 public class PhoneService extends Service { private static final Str ...

  3. SQL Server作业没有执行的解决方法

    SQL Server作业没有执行的解决方法  确保SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行    设置方法:  我的电脑--控制面板--管理工具--服务--右键 SQLSE ...

  4. (译)理解python线程

    看到一篇老外写的线程文章,很赞,零基础都能看懂.先贴在这里,有时间再翻译出来. http://agiliq.com/blog/2013/09/understanding-threads-in-pyth ...

  5. 【Foreign】咏叹 [模拟退火]

    咏叹 Time Limit: 100 Sec  Memory Limit: 256 MB Description 有n根木棍,第i根长度为ai.你要贴着墙围出一个矩形区域,木棍围成的矩形边缘必须平行或 ...

  6. Windows Phone 8.1基础教程(1) 页面导航、弹出框

    1. 跳转到其他页面 Frame.Navigate(typeof(页面),参数); 2. 后退回历史页面 Frame.GoBack(); 3. 回跳时判断 if(e.NavigationMode == ...

  7. Spring 框架的设计理念与设计模式分析(山东数漫江湖)

    Spring 的骨骼架构 Spring 总共有十几个组件,但是真正核心的组件只有几个,下面是 Spring 框架的总体架构图: 图 1 .Spring 框架的总体架构图 从上图中可以看出 Spring ...

  8. HDU 2084 数塔 (dp)

    题目链接 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数 ...

  9. bzoj 2434 fail tree+dfs序

    首先比较明显的是我们可以将字符串组建立ac自动机,那么对于询问s1字符串在s2字符串中出现的次数,就是在以s1结尾为根的fail tree中,子树有多少个节点是s2的节点,这样我们处理fail tre ...

  10. Webmin LFD to LFI

    Webmin < 1.290 / Usermin < 1.220 - Arbitrary File Disclosure (Perl) https://www.exploit-db.com ...