正则表达式入门之学习路线&七个问题
由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用:
- 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等: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、小黑点本身;转移字符“\”这个很简单,很多语言都有,主要就是把表示特殊含义的字符,消除它的特殊含义,回归到其本身的意思,比如“\$”,这里“$”就不表示行结尾了,而是就是美元符号;
- 用“()”括号括起来的,表示成了一个组,把一些字符集包含进来,成为一个整体,可以理解就是个更大的字符集
个人觉得,只要能够了解这些,基本能够看懂大部分的表达式了,也能完成一些简单的正则需求,不过复杂一点的还是需要看本书好好消化才行,之后深入学习有所收获再进行总结。
正则表达式入门之学习路线&七个问题的更多相关文章
- 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线
[Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院 欧浩源 一.引言 在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...
- 零基础快速入门web学习路线(含视频教程)
下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利 ...
- Android开发学习路线的七个阶段和步骤
Android开发学习路线的七个阶段和步骤 Android学习参考路线 第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...
- Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer
原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...
- python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度
一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...
- stm32入门学习路线个人见解
可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...
- 工作流Activiti新手入门学习路线整理
写在前面: 最近项目中使用到了工作流,虽然此部分不是自己需要完成的,但是也涉及到了要调用写的接口.正好有时间,就了解下,以便之后能在其他项目中用到时,不至于什么都不知道什么都不了解. 这里就主要整理下 ...
- 从入门到精通,Java学习路线导航
引言最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧. Ja ...
- Java入门请不要放弃,学习路线以及侧重点分析
前言: ●众多的语言,到底哪一门才是适合我的? ●我们为什么要学习Java语言呢? ●Java学习路线 我们可以通过今年最新的TIOBE编程语言排行榜看到,JAVA在"昨天".和& ...
随机推荐
- ACM数论之旅3---最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄∀ ̄))
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- RF相关知识
前言:下文中的总结都是来自于网络,有的来自与博客,有的来自于维基百科/百度百科,仅仅是为了方便查看. ASK: ASK:幅移键控调制的简写,例如二进制的,把二进制符号0和1分别用不同的幅度来表示, ...
- 使用apt-mirror搭建debian本地仓库
apt-mirror能够将官方镜像下载到本地,并保证目录结构与其一致,但是不能对镜像仓库进行修改.如果想要修改镜像仓库,需要使用reprepro. 1.安装apt-mirror # aptitude ...
- Go interface{}、类型断言
在 golang 中 interface{} 可用于向函数传递任意类型的变量, 但在函数内部使用的话, 该变量的类型就是 interface{}, 也称为空接口类型 比如我们定义一个函数, 输出字符串 ...
- 所以到底什么是 Growth Hacking?
Growth hacking 在硅谷的确是有快被用坏的趋势,之所以在大陆的互联网创业圈里还没有普及开来,我想一个是由于这个词并没有对应的中文解释,没有一个能够找到一个相对完美的解释,就像 “hack” ...
- kibana使用(ELK)、Lucene 查询语法
Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...
- 【bzoj2754】【scoi2012】喵星球上的点名
题解们: 1.首先可以被很多暴力给搞过去:我以前也是这样水过去的 2.ac自动机 2.1 抽离fail树 对点名建自动机,建$fail$树的时候只保留询问节点: 对于一个喵,子串==在自动机里匹配到的 ...
- (转)java getResourceAsStream的使用方法
背景:对于java项目中配置文件加载时候的绝对路径和相对路径做一个清晰的认识! 1 分析路径 在Java项目中会经常用到getResourceAsStream这个函数获取一些配置文件,但是怎样正确使用 ...
- CentOS 7.0源码包搭建LNMP方法分享(实际环境下)
CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这 ...
- Java-异常机制详解以及开发时异常设计的原则要求
Java-异常机制详解以及开发时异常设计的原则要求 http://blog.csdn.net/Jack__Frost/article/details/52760930?locationNum=6