关于正则表达式的入门心得

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

是请是这样的:前段时间在开发过程中遇到一个需求,从数据库中查询出来图片地址,在程序中需要加上域名,然后把所有的“\"全部替换成”/",最后替换不同的尺寸格式。已经有了现成的类似的代码实现,只需要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.“了,同样得到:

对于初学者来说理解起来好像没有那么清晰,毕竟需要先知道什么是”正则前瞻“和”正则后顾“

于是乎,咱们开始上基础姿势(我总结了一些常用的正则符号,并且加上了图片解释如下):

首先推荐一个正则表达式解释网站(很实用哦,可以进去看看,界面很简单)

https://regexper.com/       输入表达式,给出图形解释

开始看正则符号:

/g 全局匹配

/i  不区分大小写

/m 多行

连一起就可以这样写 /gi 全局匹配并忽略大小写

正则表达式两种字符

1、 原义文本字符   【就是原本的意思,比如:abc】

2.   元字符 【具有特殊意义的正则表达式中的非字幕字符】

包括:

  • .    匹配除“\r\n”之外的任何单个字符    比如  (http:\/\/www\..+)+(\.com)   可以匹配出所有的http:\\www.开头   .com结尾的网址
  • ?    0次或1次    如: \d?  
  • +   1次或多次           如:  \d+  
  • *    0次或1次或多次   如:  \d* 
  • $     结束字符,表示表达式结束,比如:  \[email protected]$ =>[email protected]能匹配上    [email protected]就不行了,因为超出了结束标记 
  • ^   开始字符   ^http:\/\/www\..+\.com$      =>http://www.baidu.com能够匹配,但是http://www.baidu.comm 或者 ahttp://www.baidu.com就不能匹配上,虽然字符串子集也包含表达式的规则
  • \ 转义符,比如,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 二〇一六年十二月一日

时间: 2024-12-28 15:16:03

关于正则表达式的入门心得的相关文章

正则表达式简单入门

 正则表达式简单入门    正则表达式在平常编程中有着大量的应用,对于任何一个想学习编程的人来说,正则表达式是一个必须掌握的知识. 废话不多说,下面先对正则表达式做一个简单的入门介绍,在后续的文章中,将会进行详细的介绍.    一.元字符 元字符一共有12个:$ ( ) [ { ? + * . ^ \ | 元字符有特殊的含义,如果要使用其字面值,则必须对其进行转义. 如: \$  \*  \( 等等 二.控制字符或不可打印字符 \a  警报 \e  退出 \f  换页 \n  换行 \r 

正则表达式(入门)

定锚点,去噪点,取数据 1.入门:正则字符 关于正则字符,很多文章都会讲到,足足有一篇文章才能描述清楚,我这里就不多说,对于我,平时,常用的有: . 匹配不包括换行的任意字符,在php的s修饰符下面可以匹配换行,如$pattern='#<div>(.*?)</div>#s';就可以匹配div内容有换行的数据. \s 空格.tab * 匹配零个或多个 + 匹配一个或多个,即至少一个 \ 转义 一个特殊字符前加\就表示转义,说明把它当普通字符用 [] 单字符取一个,比如[abc]会匹配

正则表达式快速入门,转载

正则表达式快速入门 首先简单介绍下正则表达式: 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 下面就看看正则表达式里乱七八糟的字符都是什么意思: 1.常用的元字符       代码                               说明                     . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d

AngularJS入门心得2——何为双向数据绑定

前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉的.看过了大漠的视频,算是了解了AngularJS的一些优良特性.后来准备投身<AngularJS权威教程>,跟着它走,可是一来可能自己道行不够,二来,个人觉得这本书翻译的有些生硬以及一些瑕疵,比如: (1)9.2节:在指令中适用自作用域 (2)9.2节:在指令中适用自作用域 当然,以上都是一些瑕

R语言入门心得(3) -- 向量相关

向量定义 R在实际应用中比较常用的一个对象就是向量(Vector).向量的创建格式为 向量名 = c(x1,x2,x3,…..)  或  向量名 <- c(x1,x2,x3,…..) 或  c(x1,x2,x3,…..) -> 向量名 或  Assign("向量名", c(x1,x2,x3,…..)),c()为向量赋值函数,c()可以有任意多个参数,而起返回值则是一个把这些参数首尾相连形成的向量.你可以在命令行中输入?c或者help(c)来查看函数的详细信息.例如我们要创建

正则表达式简要入门(转载)

转载 http://luolei.org/regula-expression-simple-tutorial/ 第一次接触正则表达式是在今年四月的腾讯笔试,当时是一道选择题问如何判断输入的是否是 QQ 号码(即纯数字),当时是蒙了一个答案,菜鸟不会嘛 ╮(╯3╰)╭ .事后自己倒专门学习了正则表达式,还做了笔记,可是平时开发倒的确是用得少,最近倒也忘了,近来又是校招的季节,自己就重新整理一篇简要入门,分享给大家的同时,自己也复习复习. 资源推荐 <正则表达式30分钟入门教程> :请忽略这个「3

Android 深度探索(卷1)HAL 与驱动开发 第三章 GIT 使用入门 心得体会

Android 深度探索(卷1)HAL 与驱动开发 第三章 GIT 使用入门 心得体会 本章主要介绍GIT的学习,以及介绍GIT用于获取诸多开源项目的源代码. 在使用GIT之前我们首先对其安装,其安装命令: #apt-get  install git #apt-get  install git-doc git-svn git-gui gitk 在Linux 下可以直接使用man命令查看指定命令的帮助文档.这对我们初学者提供了很大的帮助. Git的功能很复杂,为此这章节举例为我们演示如何创建版本库

R语言入门心得(1) -- 下载与安装

R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. R 是统计领域广泛使用的诞生于1980年左右的 S 语言的一个分支.R是S语言的一种实现.S语言是由 AT&T贝尔实验室开发的一种用来进行数据探索.统计分析.作图的解释型语言.最初S语言的实现版本主要是S-PLUS.S-PLUS是一个商业软件,它基于S语言,并由MathSoft公司的统计科学部进一步完善.后来Auckland大学的Robert Gentlema

第三章 Git使用入门 心得体会

第三章 Git使用入门 心得体会     通过学习Android深度探索(卷1)HAL与驱动开发的第三章Git使用入门,首先我对Git有了一定了解git是一个版本控制系统.官方的解释是:版本控制(Revision control)是一种软件工程技巧.其次我掌握了Git的使用流程. 第一步:新建分支 首先,每次开发新功能,都应该新建一个单独的分支 # 获取主干最新代码 $ git checkout master $ git pull # 新建一个开发分支myfeature $ git checko