正则表达式入门之学习路线&七个问题
由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用:
- 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等:http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html
- 常用正则表达式大全(转):http://blog.csdn.net/onebigday/article/details/5429868/
结果发现不行,要是需求完全一样也就罢了,不过有些是需要根据业务自行进行一些改变的,所以后来就找了找正则表达式入门及学习进阶的路线,想着先简单入门,能够自己对正则表达式进行一些修改之类,主要参考了下面几个知乎帖的推荐:
- 如何学习正则表达式?:https://www.zhihu.com/question/34835747
- 关于正则表达式:https://zhuanlan.zhihu.com/p/21341872?refer=passer
- 学习正则表达式有哪些入门和进阶的书籍?:https://www.zhihu.com/question/20197998
- 如何学习正则表达式?:https://www.zhihu.com/question/34835747
之后根据上述帖子的推荐,看完了网上一些教你快速学会正则表达式的教程,本来以为看完就能够根据需求写出自己想要的正则表达式了,结果看个shell正则表达式的视频后,就在linux下的vim/grep/sed等工具中使用,发现用起来还是有点问题,但还是有所提高,对正则表达式有了一点点认识:
- 慕课网-shell编程之正则表达式:http://www.imooc.com/learn/378
- 菜鸟教程-正则表达式:http://www.runoob.com/regexp/regexp-tutorial.html
- 正则表达式30分钟入门教程: http://deerchao.net/tutorials/regex/regex.htm
- 深入理解正则表达式:http://www.cnblogs.com/China3S/archive/2013/11/30/3451971.html
- 正则表达式必知必会:https://www.zybuluo.com/Yano/note/475174
后来有了更多的时间,感觉还是得系统的看完一本书,最后选的是[2012] Introducing Regular Expressions这本动物书,是从知乎帖推荐上看到的。表示看完这本书之后,感觉自己才是真的正则表达式算是入了门,想要匹配一个什么模式的字符串,不说能够写出一个非常简短or非常优美的正则表达式,至少能够写出一个比较挫的能够正确实现功能的正则表达式了。
看完这本书,解答了几个之前看那一堆网上教程表示懵逼的概念,这里用自己的话小结一下:
1. 正则表达式到底是个什么东西?
其实就是一种pattern、一种模式、一种格式、一种规则,它主要是用在文本字符串处理的时候,想要在一堆文本中找到满足某种格式、规则的字符串。
2. 正则表达式用来做什么?
至于找到之后,是想替换、修改、计数还是其他什么操作那就另说了,它做的就是一个匹配特定模式字符串的工作。
比如说有时候想把电话号码提取出来,如果你知道文本里电话号码都是xxx-xxxx-xxxx这种格式的话,那就可以写“\d\d\d-\d\d\d\d-\d\d\d\d”,满足这个正则表达式的所有字符串就会被提取出来。
3. 不同正则表达式解析器能够解析哪些正则表达式?
这里要明确一点,不是所有的正则表达式解析器都能够解析上面那些教程里面说的所有正则表达式符号,也就是说,有些正则表达式符号,在某些正则表达式解析器中是不会被解析的,解析不了!解析不了!解析不了!!!这一点必须要注意。
当然绝大多数正则表达式符号都能够被大部分正则表达式解析器解析,除非你用了非常少用的一些符号(特别是一些表示空白字符的符号,亲身经历,有些如\t\f等识别不了),如果以后有空的话,再写个测试总结帖,把哪些能用哪些不能用的符号总结一下,要是有别人总结了那就更好了,哈哈。
4. 哪些编程语言、工具能够解析正则表达式?
其实很多编程语言、工具都有用到正则表达式,比如shell里面的vim、sed、awk、grep,这几个命令其实也是大家经常用到的,它们支持基本正则表达式,如果sed、awk、grep加上-E选项的话,还能够支持扩展正则表达式;除了shell里面的命令以外,还有各种语言如JAVA、Perl、Ruby、PHP、Python、C、.NET,就算其本身不支持,也会有相关的库对正则表达式进行解析,不过这里就需要根据自己的需求自行去找了。
这些工具、语言在具体使用上会有一些小区别,但是正则表达式本身基本差别不会太大,写一个正则表达式,基本肯定是可以在所有的平台上使用的,只是由于各语言、工具的正则表达式解析器不同,有些需要一些小的改动。
5. 基本正则BREs和扩展正则EREs的区别是什么?
这一点也是之前困扰自己的一点,举个例子,有些地方 “{m,n}”这样写限定符就行了,但是有些地方又告诉你需要写成“\{m,n\}”,加了一个转义字符“\”对“{}”进行转义。这其实就是基本正则和扩展正则的区别所在,基本正则无法直接解析“{}”,但是扩展正则就可以,所以其实这两个都是对的,只是在基本正则里面使用“{}”的时候就需要加转移字符“\”,而在扩展正则里面就不需要。
这仅仅是基本正则和扩展正则的其中一个区别,应该还有其他区别,表示这里还没有详细追究,如果之后有时间,可以专门写一篇相关调研。
6. 正则表达式学习路线or相关教程有哪些?
主要就是上面说的那些,由于自己也是刚入门,有很多东西也还没看完,仅仅是能够简单使用正则表达式了,不过这里还是推荐一下我觉得不错的学习路线(有时间系统学习的人):
- 可以先把网上那些快速学会正则表达式的教程先迅速扫一遍,因为大多都是入门基础,讲得其实差不太多,看第一个的时候可以仔细看看,可能需要1-2h,后面看得就会挺快的,估计刷完也就每个1h左右;可能这时候有些同学就已经能够直接写一些正则表达式了,不过可能遇到稍微复杂的需求就又会有点懵逼
- 所以个人觉得还是需要看书,推荐看[2012] Introducing Regular Expressions这本入门,原版英文不难,特别是在前面已经看了一些中文教程做基础的情况下,开头2/3章可能需要看的比较久一些,后面会越看越快,这本书电子版一共152页,后面的附录很多,差不多真正的干货也就100页多一点,我个人看英文速度挺慢的,边做笔记差不多看了7-8h;其实我现在也就到这步,不过已经能够自己写想要的正则表达式了,算是入门,后面是我准备继续深入下去的步骤
- 看书,这3本:Mastering Regular Expressions, Third Edition;Regular Expressions Cookbook;Regular Expression Pocket Reference: Regular Expressions for Perl, Ruby, PHP, Python, C, Java and .NET;特别是第一本,在知乎上推荐的人很多,但因为太厚了,可能需要看挺久,看完之后再来补充个正则表达式进阶的文章。
7. 最快最少了解哪些正则表达式就可以实现业务需求?
有些人说没时间学这么多,想尽快能用,就是能够进行一些简单的修改,我这里勉强给点推荐,先把网上的快速教程仔细看完一个,然后保证自己能够看懂基本的一些正则表达式。正则表达式其实主要的组成部分可以分成两个,一个是匹配的字符集,一个是匹配的次数;基本上就是前面是一个字符集,后面加个限定符表示匹配的次数。这里有几个注意事项:
- 被“[]”中括号包围起来的,其匹配的目标只有一个字符,就算里面写了一堆字符,如“[0-9a-zA-Z]”,也只表示匹配一个字符,匹配的字符只能在方括号范围内;
- 经常看到“+”,“?”,“*”,“{m,n}”花括号括起来这种样子的,特别是“+”,很容易被以为是把两个匹配表达式的结果给加起来或者怎么样,注意,注意,注意,不是,不是,不是!这些就是限定符,跟在字符集的后面,限定前面的那一个字符/字符集出现的次数,具体的含义这里就不说了,自己到上面的教程上查就行;
- 还有比较重要的就是“^”和“$”,表示行开头和行结尾,“^”写在正则表达式最前面,如“^s.*”,这就表示以s开头,然后后面接任意字符的任意次数,同理“.*s$”就表示以s结尾,s前面是任意字符出现了任意次;
- “.”这个只要不是在“[.]”方括号内,以及转移字符“\.”后面,就表示任意字符,否则就表示dot、小黑点本身;转移字符“\”这个很简单,很多语言都有,主要就是把表示特殊含义的字符,消除它的特殊含义,回归到其本身的意思,比如“\$”,这里“$”就不表示行结尾了,而是就是美元符号;
- 用“()”括号括起来的,表示成了一个组,把一些字符集包含进来,成为一个整体,可以理解就是个更大的字符集
个人觉得,只要能够了解这些,基本能够看懂大部分的表达式了,也能完成一些简单的正则需求,不过复杂一点的还是需要看本书好好消化才行,之后深入学习有所收获再进行总结。