说起正则表达式,相信很多高手和大牛都不陌生,可对于我这个一年不写一段正则的人来说却是还是不知如何下手的,最近刚好接触了一些,总结写基础要点,第一用来加深记忆,第二分享给和我一样的初学者作为学习参考:
是请是这样的:前段时间在开发过程中遇到一个需求,从数据库中查询出来图片地址,在程序中需要加上域名,然后把所有的 "\" 全部替换成 "/", 最后替换不同的尺寸格式。已经有了现成的类似的代码实现,只需要 copy 过来修改一下即可,可是发现使用 C# 的 string.Replace() 方法写实在有些捉襟见肘(代码看起来没有简洁之美)于是我想用正则表达式实现这个功能。
- 1 /// <summary>
- 2 /// 使用数组拆分,取得指定尺寸的图片的Url
- 3 /// </summary>
- 4 /// <param name="imagePath">图片路径 e.g:string imagePath = @"\img\home\logo.png";</param>
- 5 /// <param name="size">资源文件夹内图片尺寸</param>
- 6 /// <param name="defaultPath">默认返回路径</param>
- 7 /// <returns>格式化的图片路径 e.g:/img/home/logo_180.png</returns>
- 8 public static string GetImageUrl(this string imagePath, string size = "_180", string defaultPath = "") 9 {
- 10
- if (string.IsNullOrEmpty(imagePath)) 11 {
- 12
- return defaultPath;
- 13
- }
- 14 //处理图片路径
- 15
- var path = imagePath.Replace("\\", "/");
- 16
- var list = path.Split('.');
- 17
- if (list.Length > 1) 18 {
- 19 list[list.Length - 2] += size;
- 20
- }
- 21
- return string.Join(".", list);
- 22
- }
这种方式是取巧,数据库中存储的图片地址一般是这种格式的:
- \img\home\logo.png而图片服务器中的资源是大小是一整套的,默认的logo.png就是原图logo_180.png就是小图logo_420.png就是一般M站、App端尺寸图等等。。。我们先对这个地址反斜线处理:
得到:
- /img/home / logo.png然后,根据.进行split为数组,将前部分的字符串拼接上"_180 " 得到"
- /img/home / logo_180然后在和png通过.Join一起,最终得到:
下面就换另一种方式,不使用数组拆分 & 合并,使用正则进行操作方法如下:
- 1 /// <summary>
- 2 /// 使用正则匹配,取得指定尺寸的图片的Url
- 3 /// </summary>
- 4 /// <param name="imagePath">图片路径 e.g:string imagePath = @"\img\home\logo.png";</param>
- 5 /// <param name="size">资源文件夹内图片尺寸</param>
- 6 /// <param name="defaultPath">默认返回路径</param>
- 7 /// <returns>格式化的图片路径 e.g:/img/home/logo_180.png</returns>
- 8 public static string GetImageUrlByRegex(this string imagePath, string size = "_180", string defaultPath = "") 9 {
- 10
- if (string.IsNullOrEmpty(imagePath)) 11 {
- 12
- return defaultPath;
- 13
- }
- 14 //处理图片路径
- 15 imagePath = imagePath.Replace("\\", "/");
- 16 //正则(前瞻)匹配转换大小,e.g.将匹配出来的 '.' 替换成'_640'+'.'
- 17 string pattern = @"(\.)(?=jpg|png|bmp)";
- 18 Regex reg = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
- 19
- return reg.Replace(imagePath, string.Format("{0}{1}", size, "${1}"));
- 20
- }
下面进行代码分解:
- string pattern = @"(\.)(?=jpg|png|bmp)";这段代码的意思是正则匹配规则:将字符串中.jpg、.png、.bmp之类的分成两组匹配,.和png或jpg或bmp其中.用于匹配并返回,
- ( ? =jpg | png | bmp)这段的中的 ? =意思是:一旦匹配到字符串中包含'.'还不算完事儿,还要继续往前看看(.后面的字符串)是否满足包含jpg或png或bmp,
- 并且.后面一旦页匹配成功,后面的部分只用于判断,不会返回这样就可以使用$ {
- 1
- }获取匹配返回来的'.'
- 我们就可以顺利的将imgPath中的.替换成 "_180."了,同样得到:'
对于初学者来说理解起来好像没有那么清晰,毕竟需要先知道什么是 "正则前瞻" 和 "正则后顾"
于是乎,咱们开始上基础姿势(我总结了一些常用的正则符号,并且加上了图片解释如下):
首先推荐一个正则表达式解释网站(很实用哦,可以进去看看,界面很简单) 输入表达式,给出图形解释 开始看正则符号: /g 全局匹配 /i 不区分大小写 /m 多行 连一起就可以这样写 /gi 全局匹配并忽略大小写 正则表达式两种字符: 1、 原义文本字符 【就是原本的意思,比如:abc】 2. 元字符 【具有特殊意义的正则表达式中的非字幕字符】 包括:好了,基本上常用的正则符号这里都介绍了,因为还有很多,而且当我去百度的时候出来了一坨一坨的,密密麻麻,真的不知如何记下来辣么多,慢慢来吧,于是我就捡了这些重要而且常见的记了下来,相信一般的需求这些也都足够使用的了。但如果要用的很 6,而且高效的话那就下功夫需要研究一番了。借用儒家提倡的那句老话:小伙儿,格物致知去吧。
今天刚刚知道随笔里面是有 "代码片段" 的功能,哈哈,可见还是写的太少啊,如果不严谨之处还望大家多多包涵,欢迎指正!
共勉之
--HelloCoder 二〇一六年十二月一日
来源: http://www.cnblogs.com/kutimes/p/6123442.html