由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用:

  • 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等: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. 可以先把网上那些快速学会正则表达式的教程先迅速扫一遍,因为大多都是入门基础,讲得其实差不太多,看第一个的时候可以仔细看看,可能需要1-2h,后面看得就会挺快的,估计刷完也就每个1h左右;可能这时候有些同学就已经能够直接写一些正则表达式了,不过可能遇到稍微复杂的需求就又会有点懵逼
  2. 所以个人觉得还是需要看书,推荐看[2012] Introducing Regular Expressions这本入门,原版英文不难,特别是在前面已经看了一些中文教程做基础的情况下,开头2/3章可能需要看的比较久一些,后面会越看越快,这本书电子版一共152页,后面的附录很多,差不多真正的干货也就100页多一点,我个人看英文速度挺慢的,边做笔记差不多看了7-8h;其实我现在也就到这步,不过已经能够自己写想要的正则表达式了,算是入门,后面是我准备继续深入下去的步骤
  3. 看书,这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. 最快最少了解哪些正则表达式就可以实现业务需求?

有些人说没时间学这么多,想尽快能用,就是能够进行一些简单的修改,我这里勉强给点推荐,先把网上的快速教程仔细看完一个,然后保证自己能够看懂基本的一些正则表达式。正则表达式其实主要的组成部分可以分成两个,一个是匹配的字符集,一个是匹配的次数;基本上就是前面是一个字符集,后面加个限定符表示匹配的次数。这里有几个注意事项:

  1. 被“[]”中括号包围起来的,其匹配的目标只有一个字符,就算里面写了一堆字符,如“[0-9a-zA-Z]”,也只表示匹配一个字符,匹配的字符只能在方括号范围内;
  2. 经常看到“+”,“?”,“*”,“{m,n}”花括号括起来这种样子的,特别是“+”,很容易被以为是把两个匹配表达式的结果给加起来或者怎么样,注意,注意,注意,不是,不是,不是!这些就是限定符,跟在字符集的后面,限定前面的那一个字符/字符集出现的次数,具体的含义这里就不说了,自己到上面的教程上查就行;
  3. 还有比较重要的就是“^”和“$”,表示行开头和行结尾,“^”写在正则表达式最前面,如“^s.*”,这就表示以s开头,然后后面接任意字符的任意次数,同理“.*s$”就表示以s结尾,s前面是任意字符出现了任意次;
  4. “.”这个只要不是在“[.]”方括号内,以及转移字符“\.”后面,就表示任意字符,否则就表示dot、小黑点本身;转移字符“\”这个很简单,很多语言都有,主要就是把表示特殊含义的字符,消除它的特殊含义,回归到其本身的意思,比如“\$”,这里“$”就不表示行结尾了,而是就是美元符号;
  5. 用“()”括号括起来的,表示成了一个组,把一些字符集包含进来,成为一个整体,可以理解就是个更大的字符集

个人觉得,只要能够了解这些,基本能够看懂大部分的表达式了,也能完成一些简单的正则需求,不过复杂一点的还是需要看本书好好消化才行,之后深入学习有所收获再进行总结。

正则表达式入门之学习路线&七个问题的更多相关文章

  1. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  2. 零基础快速入门web学习路线(含视频教程)

    下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利 ...

  3. Android开发学习路线的七个阶段和步骤

    Android开发学习路线的七个阶段和步骤           Android学习参考路线     第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...

  4. Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer

    原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  5. python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度

    一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...

  6. stm32入门学习路线个人见解

    可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...

  7. 工作流Activiti新手入门学习路线整理

    写在前面: 最近项目中使用到了工作流,虽然此部分不是自己需要完成的,但是也涉及到了要调用写的接口.正好有时间,就了解下,以便之后能在其他项目中用到时,不至于什么都不知道什么都不了解. 这里就主要整理下 ...

  8. 从入门到精通,Java学习路线导航

    引言最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧. Ja ...

  9. Java入门请不要放弃,学习路线以及侧重点分析

    前言: ●众多的语言,到底哪一门才是适合我的? ●我们为什么要学习Java语言呢? ●Java学习路线 我们可以通过今年最新的TIOBE编程语言排行榜看到,JAVA在"昨天".和& ...

随机推荐

  1. 微信小程序组件 模块化错和叹号

    wxml 页面 <import src="/pages/lianxi/lianxi.wxml" />  //引入文件 <view style='position: ...

  2. DBGridEH序号的自动生成

    序号的自动生成1.定义变量  private         maxno:integer;  public        bmodified:boolean;2.写函数  function max(c ...

  3. npm 镜像修改

    1, 修改 下载仓库为淘宝镜像  npm config set registry http://registry.npm.taobao.org/ 2, 如果要发布自己的镜像需要修改回来  npm co ...

  4. 【Python】Python基础

    源程序文件通常以.py为扩展名 #!/usr/bin/python shebang,即执行脚本时通知内容要启动的解释器 import platform 导入模块 print platform.unam ...

  5. oracle 月份中日的值必须介于 1 和当月最后一日之间

    解决方法: 1.用时间字段去关联字符串字段导致此错误.. 如果1.解决不了就看 2.把date'2017-01-01'  换成 to_date('2017-01-01','yyyy-mm-dd')

  6. Leetcode模拟题篇

    43. Multiply Strings 高精度非负整数的乘法. string multiply(string num1, string num2) { '); ; <= i; --i) { ; ...

  7. Crawl(2)

    http://cuiqingcai.com/3179.html # *-* coding: UTF-8 *-* import urllib2 import cookielib import re im ...

  8. Alpha 冲刺 —— 十分之九

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...

  9. Alpha 冲刺 —— 十分之六

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...

  10. 【bzoj3195】 Jxoi2012—奇怪的道路

    http://www.lydsy.com/JudgeOnline/problem.php?id=3195 (题目链接) 题意 一张$n$个点$m$条边的无向图,每个点度数为偶数,一个点只能向标号与它的 ...