博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于正则表达式的入门心得
阅读量:5921 次
发布时间:2019-06-19

本文共 3806 字,大约阅读时间需要 12 分钟。

说起正则表达式,相信很多高手和大牛都不陌生,可对于我这个一年不写一段正则的人来说却是还是不知如何下手的,最近刚好接触了一些,总结写基础要点,第一用来加深记忆,第二分享给和我一样的初学者作为学习参考:

是请是这样的:前段时间在开发过程中遇到一个需求,从数据库中查询出来图片地址,在程序中需要加上域名,然后把所有的“\"全部替换成”/",最后替换不同的尺寸格式。已经有了现成的类似的代码实现,只需要copy过来修改一下即可,可是发现使用C#的string.Replace()方法写实在有些捉襟见肘(代码看起来没有简洁之美)于是我想用正则表达式实现这个功能。

1      ///  2         /// 使用数组拆分,取得指定尺寸的图片的Url 3         ///  4         /// 图片路径 e.g:string imagePath = @"\img\home\logo.png"; 5         /// 资源文件夹内图片尺寸 6         /// 默认返回路径 7         /// 
格式化的图片路径 e.g:/img/home/logo_180.png
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      ///  2         /// 使用正则匹配,取得指定尺寸的图片的Url 3         ///  4         /// 图片路径 e.g:string imagePath = @"\img\home\logo.png"; 5         /// 资源文件夹内图片尺寸 6         /// 默认返回路径 7         /// 
格式化的图片路径 e.g:/img/home/logo_180.png
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.   
元字符 【具有特殊意义的正则表达式中的非字幕字符】
包括:
  •   .    匹配除“\r\n”之外的任何单个字符    比如  (http:\/\/www\..+)+(\.com)   可以匹配出所有的http:\\www.开头   .com结尾的网址
  • ?    0次或1次    如: \d?  

     

  •   +   1次或多次           如:  \d+  

  •  *    0次或1次或多次   如:  \d* 

     

  • $     结束字符,表示表达式结束,比如:  \d@com$ =>1@com能匹配上    1@comm就不行了,因为超出了结束标记 

     

  • ^   开始字符   ^http:\/\/www\..+\.com$      =>能够匹配,但是m 或者 a就不能匹配上,虽然字符串子集也包含表达式的规则

     

  • \ 转义符,比如,b只是个字符,\b就是边界的意思 

     

       \\就是\的意思
  • () 分组,这个比较好,清晰。将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
    • 比如:^([a-zA-Z]{1,6})@(qq|163)(\.com)$  

       

  • \d 数字          匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持

     

  • \D 非数字      匹配一个非数字字符。等价于[^0-9]。grep要加上-Pperl正则支持 

     

  • \w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集。

     

  • \W  匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

     

  • {m}{m,n}    形容一个匹配项出现m次,或者m-n次 如:\w{6} 

     

  • [mn]等同于m|n  字符类,范围类[a-z]闭区间,包含a和z的26个小写字母 

     

  • \t   匹配出我们键盘上的tab空格 

     

好了,基本上常用的正则符号这里都介绍了,因为还有很多,而且当我去百度的时候出来了一坨一坨的,密密麻麻,真的不知如何记下来辣么多,慢慢来吧,于是我就捡了这些重要而且常见的记了下来,相信一般的需求这些也都足够使用的了。但如果要用的很6,而且高效的话那就下功夫需要研究一番了。借用儒家提倡的那句老话:小伙儿,格物致知去吧。

 

今天刚刚知道随笔里面是有“代码片段”的功能,哈哈,可见还是写的太少啊,如果不严谨之处还望大家多多包涵,欢迎指正!

共勉之

                                                                                                                       --HelloCoder 二〇一六年十二月一日

转载于:https://www.cnblogs.com/kutimes/p/6123442.html

你可能感兴趣的文章
分布式与集群的联系与区别
查看>>
不重新编译php安装配置eAccelerator
查看>>
_beginthreadex注意事项
查看>>
xcode 打包
查看>>
消息队列库——ZeroMQ
查看>>
android 物理按键 监听
查看>>
python 批量重命名
查看>>
多模匹配算法之Aho-Corasick
查看>>
android中的style部分属性值介绍 --zz
查看>>
Storm消息可靠机制
查看>>
Android-Universal-Image-Loader
查看>>
第6章 Selenium2-Java 自动化测试模型
查看>>
解析.NET对象的跨应用程序域访问(下篇)
查看>>
工作流管理系统
查看>>
模式对话框
查看>>
pandas汇总和计算描述统计
查看>>
5 安装Alloc服务
查看>>
log4j(三)——如何控制不同级别的日志信息的输出?
查看>>
消息系统架构设计演进
查看>>
BZOJ 1076: [SCOI2008]奖励关 [DP 期望 状压]
查看>>