正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang

所属分类: 正则表达式学习日记 

书名:     学习正则表达式
做者:     Michael Fitzgerald
译者:     王热宇
出版社:   人民邮电出版社
丛书:     图灵程序设计丛书

 
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 封面】
 
前言
 
正则表达式是通过专门编写的文本字符串,它能够用来匹配文件内的字符串集合中符合该模式的全部字符串。通俗的说,就是一个很厉害的、能够查找、匹配和替换任何须要内容的工具。
 
 
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【插入图片 进阶书目】
 
要真正掌握正则表达式,最好的学习方法是亲身实践,而不是作个旁观者。
最好把全部示例都过一遍,按照示例本身操做。
 
 
第1章  什么是正则表达式
 
大多数支持正则表达式的编辑器或工具,其实现正则表达式的方式并不彻底一致,其中的一个主要缘由,笔者估计该是由于正则表达式的可组合性很强 Composability,只要是掌握了其内核以及构造方法,那么就能够用各类不一样的方式来组合,进而匹配出任意的字符。
 
正则表达式处理工具:
一、在线工具
雪炭工具:http://snowcoal.com/tools/regex/reg  #实时匹配效果杰出,能够将匹配结果单独列出,笔者很喜欢
RegExr:https://regexr.com/v1/                 #进行替换操做不错           
 
二、软件
Notepad++
 
 
书的每一章结尾都有一节“技术备忘录”,笔者认为这个方法实在不错,很值得借鉴。其利在两个方面,一则将须要额外添加的拓展延伸知识涵盖在了读者的视野之中,二则虽是可让读者得到此拓展延伸,但却并不是直接在涉及之时便囫囵给出,而是稍提一句如“此主题之拓展,着实厉害,现已附于章尾,可于学完此章后往观之以资补充”即可,尔后继续主题而谈,不致所以拓展而打断正文节奏。
 
自此以降,凡代码,皆以括号括之;凡代码分析,皆以符号>>>导之,以便阅读与理解。
 
若要匹配一串电话号码:707-827-7019,该当如何?
 
(一)字符串字面值 String Literal
 
1.1.【707-827-7019】
 
>>>所谓字符串字面值,也就是同名字说的通常,你字面上是啥,我就输入啥来匹配你。这是咱们在日常检索时经常使用的,如在百度中检索【Mr_Ouyang】,便会将符合这个匹配模式的结果返回给你。
 
(二)字符组 Character Class
 
1.2.【[0-9]】
 
>>>所谓字符组,也就是如同数组通常,指定一个下界(如此处的 0),指定一个上界(如此处的 9),再用“-”将上下界链接起来,表示从下界到上界的范围中的一切数;在上下界以外,须要用方括号“[]”括起来,表示这是一个字符组。
 
>>>方括号,是一种元字符 Metacharacter,又称为 原子 Atom。在正则表达式中,全部的元字符都不参与匹配,所以也将元字符不会参与匹配(能够理解为不会被咱们抓壮丁,哈哈~)而保留下来的特性,将它们称为保留字符。
 
>>>字符组,有时也称做字符集 Character Set。
 
1.3.【012789】
 
>>>显然,将字符值放入方括号,能够实现对这些字符的匹配,从而将电话号码707-827-7019给交替高亮出来。
 
(三)字符组简写式 Character Shorthand
 
1.4.【\d\d\d-\d\d\d-\d\d\d\d】
 
>>>\d,是对0-9的数字的字符组简写,其效果等同于[0-9]。
   此处的连字符被做为字面值。
 
>>>字符组简写式,也叫转义字符 Character Escape。可是这个叫法着实容易让人与后面将会介绍的转义字符相混淆,故通常不提倡这样叫。
 
1.5.【\d\d\d\D\d\d\d\D\d\d\d\d】
 
>>>\D,是对\d的转义 Escape。前面说到\d表示数字字符,将其意义转换为相反的,天然即是非数字字符了;虽然这样看来这纯粹是废话,但换种方式阐述,即是\D是表示除了数字以外的其余字符,譬如“.”、“%”、“|”这些,均可以用它来表示,所以此处将代码4中的字面值连字符“-”以\D来代替表示。
 
>>>关于转义,由上面的特殊能够看出其通常规律,即是取反。
   打个比方,已知小明是男的,如今有一位计算机“老师”让你们互相帮忙填一份表格,里面有一栏性别,咱们假设可使用正则表达式,那么若是女生小红给小明填写的是“\男”,那么最后这位老师识别出来的结果即是小明是个女孩;一样的,若是小明给小红的填的是“\女”,那小红在老师眼中也就是小男生了。
 
>>>而更通常的,对那些小写的表达式、命令等,大多都是能够经过转义其相应大写来实现取反的。【此处待补充大写取反】
 
(四)“.” 任意字符匹配
 
1.6.【\d\d\d.\d\d\d.\d\d\d\d】
 
>>>点号是一个通配符,它能够匹配任意字符。这样理解,在抓壮丁这一个行当上,因为点号它比较厉害,谁都难以逃脱它的魔爪,那些壮丁统统均可以被它匹配到而后抓回去,因此敬畏地称它为通配符。
 
>>>可是有一点须要注意,有一个美女它是奈何不了的,毕竟英雄难过美人关。这个美女叫作行起始符,也就是后面将会介绍的脱字符“^”,顾名思义,她能够表明一个行的开始之处。
 
>>>固然了,这位英雄若是吃下了小药丸,纵然那位美女多么妖孽,都难逃英雄的手掌心,会被抓壮丁的(抓到床上,哈哈~)。这个小药丸就是(Dotall),没错,就是这位英雄的伴生装备(英雄名叫Dot),若是须要征服美女“^”时,那就将Dotall选项勾选上,就能够连美女也一同抓住。
 
(五)捕获分组和后向引用 Capturing Group & BackReference
 
1.7.【(\d)\d\1】
 
>>>用括号括住的壮丁,咱们就叫作捕获的分组(如此处的(\d)),它既然被咱们捕获了,天然不会那么容易放过它,因此咱们在本来应该由第三个壮丁来站的位置,经过一个叫作后向引用的方式安排给了这个被咱们一举捕获的壮丁了(如此处的\1),此时咱们就用这个\1来表示,这里放的是我以前费力捕获到的壮丁,可不通常哦,一个顶俩(甚至更多)!所以,在咱们匹配好的结果中,就应该是那串电话号码的前3个字符:707。
 
>>>由此咱们能够发现,若是一个壮丁出现了不少次,那么它确定是要被咱们捕获住!毕竟能够省时省力,何乐不为?接下来咱们扩展一下这个壮丁队列。
 
1.8.【(\d)0\1\D\d\d\1\D\1\d\d\d】
 
>>>上面的表达式能够匹配出:707-827-7019。
   不难看出,7被咱们抓住后,一共被咱们使唤了4次,能够说很全力以赴了,哈哈~真坏!
 
(六)量词
 
1.9.【\d{3}-?\d{3}-?\d{4}】
 
>>>用花括号括住的数字,表示咱们要抓的壮丁个数(如\d{3}就表明咱们要抓3个数字壮丁)。
   含数字的花括号,是一种量词 Quantifier。
   花括号自己,是元字符。
 
>>>在上面咱们还使用了一个新玩意儿,问号“?”。它是助纣为虐的好帮手,咱们可离不开它!凡是咱们抓壮丁的时候,在后面附上一个问号,便表明咱们抓零个或者只抓一个壮丁。乍一看以为没啥用呀,这么仁慈,还像咱们吗?
   其实,李宗吾大佬给咱们说过,纵然咱们在作些伤天害理、损人利己的事情,也要戴上个悲天悯人、大公无私的面具,无论有多少人能最后看出咱们的真实一面,反正能将多少人瞒住就瞒住多少!
   同理,有了这个问号帮忙,等于就是咱们给了壮丁们一丝生机(毕竟在他们看来,咱们只有一半的概率会抓他嘛,哈哈~),不致于负隅顽抗啦;至于最后是抓,仍是不抓...那固然看咱们须要不须要这个壮丁啦!须要的话,管他仁义道德,抓他娘的!!不须要的话,那就放过他,还能积点美誉呢。
   在此处,显然咱们对于连字符不是很必需,毕竟有的人可能比较马虎,写电话号码时就省去了连字符如7078277019这般,如此的话,抓它仍是不抓它,就看到时候咱们需不须要它了,若是咱们匹配的目标全是没有连字符的如7078277019,那固然不抓它啦;可若是都是707-827-7019这样的,嘿嘿...
 
>>>说到为虎做伥,就不得再也不提一下其余两位好帮手了,他们分别是:
   加号“+”,他表示咱们可能会从字符组中抓取所有的壮丁,但也可能只抓一个(即匹配一个或多个)
   星号“*”,他表示咱们可能会从字符组中一个也不抓;固然啦,既然是为虎做伥好帮手,发起狠来咱们都怕的呢,按照这位好帮手的履历,更多的时候他但是所有都抓、一个不留!!(即零个或多个,也即任意个)
 
1.10.【(\d{3,4}[.-]?)+】
 
>>>有没有看花眼?哈哈,这年头,抓壮丁也须要文化,否则壮丁可不老实呢!来,让咱们好好学学抓壮丁的文化。
   根据咱们上面学的,\d就是抓数字啦。
   {3,4}呢,就至关于量词的一种扩展了,意思就是最少要抓够3个,最多呢抓上4个就好了。
   [.-]呢,至关于咱们要从由点号和连字符组成的字符组中抓取它们。
   [.-]?,则表示咱们可能会对点号和连字符发善心,有必定可能放它们一马,也就是说,咱们据此而抓取的壮丁,多是以下三种状况:a、只抓了有1个点号  b、只抓了1个连字符  c、他们俩一个都不抓,全放了
   (上述表达式),则表示咱们把上面说起的那些家伙都给捕获了!
   (表达式)+,就表示咱们把这些家伙给抓住后,最少会抓一次(也就是上面一步刚抓住他们的时候)壮丁,最多的话可能抓上任意次
 
>>>综合起来,就是咱们会把这样的三位或者四位的数字给抓起来:
   a、它自己是三位数Or它自己是四位数
   b、它后面跟着一个点号Or它后面跟着一个连字符
   同时知足上述两个特征的,就是咱们的刚下的这个套子要捕捉的目标壮丁,就是说咱们编写模式,就是一个下套子抓壮丁的过程,不过就是看壮丁是什么样的,咱们就编对应的套子罢了;理论上说,咱们能够把全部壮丁都抓起来,只要咱们可以懂得全部下套子的方法并且会灵活地使用;也就是说,不存在套不住壮丁的套子,若是有哪一个壮丁你抓不住,那只不过是你还不会抓住这个壮丁的下套子方法而已,经过学习,你是能够最终征服它的。
 
>>>再回到咱们刚刚下的这个套子上,很显然,若是咱们一个一个元素地去分析,仍是能够很清晰地将套子的构造给搞懂的,再让咱们来下一个一样的或者相似的,也是妥妥的没问题。
   可是咱们分析后可能会发现,彷佛这个套子范围大了些呀,虽然是可以将咱们的目标707-827-7019给抓住,但若是还有些咱们不要的路人甲乙丙丁在咱们目标边上,咱们就可能连他们也一同抓了,那可真是吃力不讨好!
   下面咱们举几个例子来看看这个套子可能会把哪些路人甲乙丙丁误抓了:
   a、707.827.7019
   b、7078277019
   c、123
   d、1234
   e、123.
   好家伙,比咱们还狠呀,可见以前工业革命刚开始的时候劳苦群众抱怨“机器吃人”还真不是虚的,让咱们本身亲自上场来抓,估计也就抓了目标707-827-7019就收手了,而这个套子呢(能够理解为一个工具、机器),不只把咱们的目标给抓了,还把许多咱们不须要的也给抓了来,效率可真高,也真狠呀,哈哈!!
 
1.11.【(\d{3}[.-]?){2}\d{4}】
 
>>>很显然,这个新下的套子就把上一个套子的误抓的毛病给改掉了,变得更加具备针对性了。
   先抓3个数字。
   再在这三个数字后面抓0个或1个点号或连字符。
   将前两步抓取的3个数字与点号或连字符的组合,重复一遍;等于将这个组合抓上两遍。
   最后再抓取4个数字
 
>>>综合起来,咱们发现,咱们的目标,不管是规范的707-827-7019,仍是不规范的707827701九、或是707.827.7019,就都被咱们抓到了。
   这就不致于产生误抓的状况了。这个例子也从一个侧面给咱们说明了,对症下药、看人下套的重要性。
 
1.12.【^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$】
 
>>>看的都眼花缭乱了吧?只是为了将一种更加不规范的壮丁(707-827-7019)抓住(其实也就是带了括号的号码啦),咱们竟然要下这么麻烦的套!
   其实说奇怪也正常,毕竟以咱们刚刚下套抓壮丁的技术,已经蛮炉火纯青了,所谓百尺竿头更进一步,即是说咱们已经这么厉害了,要想再更进一步,实在是难呀!因此呀,为了将套子再完善些,麻烦是必要的,也是有意义的,哈哈!
 
>>>在分析咱们是怎么在捕捉那些目标的基础上,增长对括号目标的捕捉的以前,先来介绍下以前就已照过面的那位美女,脱字符“^”。这脱字符通常有两个做用,第一个是放在开头做为起始符(如此处通常);第二个做用是取反,由于后面会讲到,因此此时便暂按下不表,毕竟仍是要给美女保留点神秘感!
 
>>>除了脱字符出场了,还有一个咱们耳闻已久的大人物也终于闪亮登场了,那就是转义字符“\”。因为咱们要匹配的括号在正则表达式中已经有了其特定的用处(用来抓壮丁,捕获分组,哈哈),因此为了不那些长着和咱们“本身人”通常无二外表的壮丁由于被看错而被咱们错误地放过,咱们须要先给那些壮丁搞一场冤案,以莫须有的罪名加于其身!!这样子,即便它真是咱们“本身人”,咱们都会绝不放过地抓起来,更况且咱们已经确切地知道它并不是本身人了,更是直接一抓而下了!
   也就是说,若是咱们须要把那些和本身人长得雷同的壮丁抓起来,不能光是像对待普通壮丁同样直接抓取,由于这样极可能让咱们“本身人”的队伍里人心惶惶,担忧本身哪天也可能如它通常被咱们抓了嘛;而是应该先给它定个莫须有之罪,形式呢,就是在它面上自西北而往东南地划下一刀(什么鬼?哈哈),也就至关于古代给犯人“刺配”通常啦。这样呢,就把它和咱们本身的同志给划分开来了,抓起来就不会有那么多羁绊啦!
   在此处,咱们就是把左右括号都用斜线转义了。
 
>>>另外,有一个新符号,竖线符“|”,它表示从左右表达式组合中选择其中一个,如此处的便表示:能够选择带括号的,也能够选择不带括号的。
 
>>>最后那个字符,称为美圆符,它标志着行结束位置,是否是感受和前面讲到的行起始符“^”这位美女有些相似?不妨这样想,和美女风花雪月一番,看看电影吃吃饭,老是先要以美女为发端的嘛,没有美女在身边,看电影和吃饭就用不着那么庄严郑重了;而看完电影吃完饭,要怎么样结束这样一个与美女约会的活动呢?固然是付钱啦!!美刀!!嗯,就这样记,哈哈~
 
学到这里,咱们已经将正则表达式的大体内容都有了必定了解了,下面咱们来看看究竟学了这玩意儿能有啥用。
 
好,假如我如今吃饱了撑的,想要从这篇文章中找出全部我写的那些正则表达式,用来自我陶醉一番。
 
首先,咱们要肯定要抓取的对象壮丁:就是那些可怜的正则表达式啦;
接下来,咱们要分析这些对象壮丁都有些什么特征:因为本文在撰写之初便统一了正则表达式的规范,也就是,首先是一个阿拉伯数字用来表示这个代码是第几条代码,后面跟一个英文点号,尔后是符号【】,咱们须要看的代码就在黑框里面呢;
第三步,将咱们发现的特征转换为已知的表达式符号:
    在这一步,咱们将其分解为两小步。
    a、树典型:这一小步中,咱们先找典型的代码,如首、尾以及特殊者,本例中,选取了一、12以及10做为典型,以下:
       1.1.【707-827-7019】
       1.10.【(\d{3,4}[.-]?)+】
       1.12.【^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$】
    b、找规律:
    I.咱们发现,开头是从1到12的数字,是否是能够用\d来表示呢?答案彷佛是,但好像又不全是,好比说10,11,12这样的,好像表示不了呀,\d不是只能匹配0到9的数字嘛?其实咱们彻底能够灵活搭配组合,来实现本身的定制化表达式。先放出表示10到19的代码:[1]\d。是否是以为很讶异?竟然还有这样的操做!分组其实也是能够做为字面值的,尤为是在组合的时候,尤其有用,哈哈~既然会表示10到19了,想必将0到99表示出来应该没什么难度了吧?没错,方法是:\d\d,或者是\d{2}。说了这么多,咱们总结下这一点的代码:\d|\d{2}
    II.数字以后,跟着一个点号,跟着一个【符号,因此能够将这两个直接用字符值来表示:.【
    III.中间的代码字符咱们不知道有多少种符号以及有多少个,那干脆就用能够表示任意字符的点号再配上能够表示任意个数的星号来表示它们:.*
    IV.最后将代码包括在里面的还有一个符号】,因此再添加上一个字面值:】
    上述所言,综合起来便获得了:\d.【.*】|[1]\d.【.*】
>>>注意一点,凡是涉及“|”的操做,如果每一步的后面都有对应的代码,那么就应该将每个用“|”来表示选择的选项都添上,如此处的,显然\d表示的是0到9序号的代码,而[1]\d表示的是10到19序号的代码,若是咱们光顾着给“|”后面的添加后续代码,那么1到9的序号代码将没法获得匹配。一言以蔽之,要雨露均沾,哈哈~
     下面把用雪炭工具来测试的截图贴出,以下:
 
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 示例】
>>>因为上面咱们复制粘贴了三条典型代码做为树立的典型,因此咱们一共检索出了15条代码,都是整行匹配,厉害吧?若是用Word确定搞不来,起码我是搞不来的,哈哈~
   那么,咱们如何将那些代码所有提出来,而不须要经过像是在Word中那般替换掉符号【】呢?这个咱们能够在接下来的学习中学到,此时暂且按下不表。哈哈~
 
接下来咱们总结下,咱们在这第1章中学习了哪些东西:
 
*  什么是正则表达式?
*  字符串字面值是什么?要怎么样使用?
*  字符组是什么?要怎么样使用?
*  字符组简写式是什么?要怎么样使用?
*  点号是什么?要怎么样使用?
*  捕获分组是什么?后向引用是什么?要怎么样使用?
*  量词是什么?要怎么样使用?
*  问号、加号和星号分别是什么?要怎么样使用?
*  脱字符、竖线符、美圆符分别是什么?要怎么样使用?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
1.1.【707-827-7019】
1.2.【[0-9]】
1.3.【012789】
1.4.【\d\d\d-\d\d\d-\d\d\d\d】
1.5.【\d\d\d\D\d\d\d\D\d\d\d\d】
1.6.【\d\d\d.\d\d\d.\d\d\d\d】
1.7.【(\d)\d\1】
1.8.【(\d)0\1\D\d\d\1\D\1\d\d\d】
1.9.【\d{3}-?\d{3}-?\d{4}】
1.10.【(\d{3,4}[.-]?)+】
1.11.【(\d{3}[.-]?){2}\d{4}】
1.12.【^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$】

 
第2章  简单的模式匹配
 
正则表达式惟一的用途,即是在文本中匹配和寻找模式,接下来咱们介绍一些简单常见的模式匹配。
 
通常咱们在匹配时,都会默认开启全局匹配 Global 选项,这样就不会单在某一行匹配,而是从全文中找到符合咱们所下套子的壮丁。
 
在第1章咱们讲了字面值、字符组以及字符组简写式,它们能够相互组合搭配,以实现不一样的需求。
 
首先,咱们先肯定一下最低纲领,也能够说是红线,那即是成功匹配出咱们须要的结果;
接着,咱们要在红线之上追求最省力的实现方法,也就是写最简短的、能够匹配出目标的模式,归纳为简短优先原则;
最后,咱们才追求其性能上的提高,譬如不须要捕获分组时便不捕获之、不须要回溯时便不采用具备回溯操做的方式等(看不懂吧?这些咱们会在后面分别讲到,莫要着急,哈哈~);这即是咱们的最高纲领。
 
下面咱们来分析一下字符组匹配与字符组简写式匹配的特色:
    a、字符组,能够精确匹配字符,给出哪些字符就匹配哪些字符,灵活、精确匹配,一点也不“误抓”;但使用时须要明确知道有哪些对象,可行性上局限较大
    b、字符组简写式,简短精练;但易“误抓”,不够灵活
 
显然,将多个元素搭配起来组合使用,才是咱们实现抓壮丁大业的最佳之策。
 
前面咱们知道,数字0到9的字符组简写式是\d,如今咱们来介绍下简写式。所谓简写式,即是经过对一个与式子同义的单词或词组的简写来表达一个式子,如\d表示的是数字,而数字的英文单词即是Digit,故而取其首字母表示;一样的道理,其他的简写式也用其同义单词首字母表示,所以,笔者看来,记住其同义单词是记忆简写式的好方法。
 
那么究竟有哪些咱们往后能够用得上的简写式呢?以下:
 
*  \d    Digit                    数字字符                 *  \D    非数字字符
*  \w    Word                     单词字符                 *  \W    非单词字符
*  \o    这个我也不知道,哈哈      空字符
*  \a    Alert                    报警符
*  [\b]  Backspace                退格符
*  \c x  Control                  控制符
*  \s    Space                    空白符                   *  \S    非空白符
*  \t    Table                    制表符
*  \n    NextLine                 换行符
*  \r    Return                   回车符
*  \f    暂不知                   换页符
*  \h    暂不知                   水平空白符                *  \H   非水平空白符
*  \v    暂不知                   垂直制表符                *  \V   非垂直制表符
*  \b    Border                   单词边界    

*  \o    xxx                      字符的八进制值
*  \x    xx                       字符的十六进制值
*  \u    xxx                      字符的Unicode值

 
2.1.【\d】
2.2.【[0-9]】
2.3.【[0123456789】
 
>>>上面都表示匹配0-9,单若是咱们只须要匹配含有0和1的,则须要代码2.4,以下。
 
2.4.【[01]】
 
>>>从这里咱们能够看出字符组在精确匹配字符方面,远甩简写式一条街。
 
2.5.【\D】
2.6.【^0-9】
2.7.【^\d】
 
>>>上面都表示匹配除了0到9意外的全部字符。除了斜杠“\”,咱们还发现,脱字符这个美女竟然也能够扮演这样的转义的角色,哈哈,这就是咱们刚刚没有揭开的面纱,如今这位美女已经彻底裸露在你面前啦~
 
2.8.【\w】
2.9.【_a-zA-Z0-9】
 
>>>上面都表示匹配全部单词字符(固然啦,要勾选Global选项啦)。从代码2.9咱们能够看出,原来单词就是由下划线“_”、小写字母a到z、大写字母A到Z、数字0到9组合而成的玩意儿呀,哈哈~
 
2.10.【\W】
2.11.【^_a-zA-Z0-9】
2.12.【^\w】
 
>>>上面都表示匹配全部非单词字符,如空格、标点等。
 
2.13.【\s】
2.14.【 \t\n\r】
 
>>>上面都表示匹配全部空白符。从代码2.11咱们能够看出,原来空白符就是由空格、制表符、换行符和回车符组合而成的玩意儿。不过有一个要注意,空白符匹配出来的结果,只有空格与制表符能被高亮显示,而换行符与回车符是高亮不来的,但它们确确实实地被咱们匹配住了;若是很差理解的话,权且把换行符和回车符当成葫芦娃中那个会隐身术的六娃吧,虽然你隐身了,但咱们仍是能够把你给抓住的,要否则七星丹又怎么可能炼成呢,哈哈~
 
2.15.【\S】
2.16.【^ \t\n\r】
2.17.【^\s】
 
>>>上面都是匹配全部非空白字符的。
 
2.18.【........】
2.19.【.{8}】
 
>>>上面都是匹配任意八个字符组成的组合的。如词组“The Love”。
 
2.20.【\bL.{2}e\b】
 
>>>上面代码2.20是匹配单词Love的,其中\b是匹配单词边界的字符,能够想见,一个单词它的前面和后面要么即是空格、要么即是标点、要么即是段落标记符、结束标记符,因此咱们彻底能够经过\b来匹配出由空格、标点等做为边界隔出的单词。
 
>>>代码2.20其实还给咱们指出了一个该表达式所具备的特性,那就是特指性 Specificity。由于它首先制定了边界,而后指定了开头字符为L,而后指定了中间字符为两个,最后指定告终尾字符为e并指定边界。
 
2.21.【.*】
2.22.【^\n】
2.23.【^\n\r】
 
>>>上面都是匹配一行中任意个字符的代码。从中咱们能够印证咱们先前学习的,点号虽然是个大英雄,但也过不了美人关,因此遇到要捕捉脱字符也没辙;而脱字符通常不做为简写式,与脱字符起着一样的表示行标记的简写式主要是换行符“\n”与回车符“\r”,因此若是对他俩取反、将他俩排除在外,那就等于起到了点号匹配除了行标记外全部字符的效果了。
 
接下来咱们对前面有过介绍的捕获分组、后向引用作一个扩展。
他们搭配起来能够干吗呢?能干的多了去了,事实上,他们但是抓壮丁的黄金搭档,他俩尤为擅长浑水摸鱼,偷偷摸摸的就把壮丁神不知鬼不觉地抓了,抓了还不算,还给这被抓获的壮丁穿上了马甲,只要咱们想,无论是什么马甲,他俩都能给壮丁披上!这么一听,彷佛仍是用处不大呀,咱们没事给壮丁披马甲干吗?哈哈,入戏太深啦,让咱们来看看实例。
加入我如今从新回过头去看咱们第一章那些代码,看了以后发现彷佛有哪一个地方不太对劲,话很少说,先上图,以下:
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 演示截图第一章】
 
是否是发现没啥问题?再看下一张图,第二章咱们的代码,以下:
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 演示截图第二章】
 
如今发现了吧?我若是须要将第一章中全部代码都像第二章那样,在每个代码序号前都添加一个代码章节的序号怎么办呢?好比说1.1.1.【...】这样的。
 
如今能够请出捕获分组和后向引用这对黄金搭档!
咱们打开RegExr网站,单击切换到Replace,而后将文章所有都复制粘贴进去那个文本框,尔后再第一个匹配框中输入:\d[.]【.*】|[1]\d.【.*】  而后你会发现,你已经把全部的第一章代码都给匹配出来了,须要注意的是,因为咱们在上一段中给出了1.1.1.【...】,因此,咱们匹配出来的结果将由上面的总共15个结果变为16个了,由于这个的后面一小段也是符合咱们的规则的。
事实上,若是你把表达式中点号外面的平括号给去掉的话,你将发现匹配的结果竟然高达三十多个,缘由就出在点号身上。咱们知道点号能够表示任意字符,那么匹配的工具天然会将点号做为任意字符来匹配,这样的话,倒不是没有结果来给它额外匹配出来的,比方说,2.9以上的那些代码,如2.10.【...】。观察划线部分,是否是以为能够匹配?一个数字(1)加上一个能够由点号匹配的任意字符(数字固然也能够匹配啦,因此0到9均可以被匹配到)再加上符号【...】,完美!因此咱们就获得了三十多个匹配结果...这固然不是咱们想要的啦,因此,最好给点号加上方括号,这样就至关于告诉工具:我这个是点号良民,不是通吃的大英雄!
下面给出截图以下:

正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 演示11】
 
下面咱们再对这个改进一下,虽然匹配到了这些壮丁,但咱们可不仅是想要抓如今的他们,如今还未入流呢,须要给他们披个马甲好看一些!
下面切换到Replace标签,此时再出现一个文本框,咱们先将第一个文本框里咱们刚刚输入的表达式修改一下,变成被咱们捕获的分组:(\d[.]【.*】)|([1]\d.【.*】),理解起来应该不会有难度吧?下面看好啦,在新出现的那个最下面的文本框中输入要替换的表达式,此处咱们要达到的目的就是1位数保持一位数的(也就是$1),而两位数的则保持两位数的(即$2),因此咱们就在替换框输入:1.$1$2,意思是将咱们捕获的两个分组都加上表示章节序号的1和点号,而后第一个分组的按照第一个分组那样、第二个则按照第二个那样。
 
>>>有一个须要注意到的是,咱们在前面介绍的后向引用使用的是\1这样的符号,可是有的时候某些在线工具或者软件并不支持这样的形式,这时咱们就能够用它的另外一个形式$1,即用美圆符。
 
下面是关于最终替换的截图以及两个文本框中咱们的输入公式:
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 演示12】
 
接下来咱们总结下,咱们在这第2章中学习了哪些东西:
 
*  正则匹配的最低纲领、进阶阶段以及最高纲领分别是什么?(PS.这些是笔者本身的命名,哈哈,随便起的,你在其余地方可能看不见相似的表述)
*  字符组和字符组简写各有什么特色?为此咱们应该如何实现个性化的匹配?
*  文中介绍了的简写式有哪些?如今只须要对它们有一个认识便可,对其用处大可没必要求全求备,毕竟它们中的大多数是咱们不大可能用得上的,若是往后须要,那就再对它进行检索专门学习,此为任务驱动。
*  什么是Global模式?
*  如何匹配单词和非单词?
*  如何匹配空白字符?
*  能够表示转义的分别是哪两个字符?
*  点号搭配什么能够实现真正意义上的通吃?
*  捕获分组和后向引用在实际生活中能够用来干什么?
*  后向引用的两种方式分别是什么?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
2.1.【\d】
2.2.【[0-9]】
2.3.【[0123456789】
2.4.【[01]】
2.5.【\D】
2.6.【^0-9】
2.7.【^\d】
2.8.【\w】
2.9.【_a-zA-Z0-9】
2.10.【\W】
2.11.【^_a-zA-Z0-9】
2.12.【^\w】
2.13.【\s】
2.14.【 \t\n\r】
2.15.【\S】
2.16.【^ \t\n\r】
2.17.【^\s】
2.18.【........】
2.19.【.{8}】
2.20.【\bL.{2}e\b】
2.21.【.*】
2.22.【^\n】
2.23.【^\n\r】

 
第3章  边界
 
这章咱们要学习的是边界,顾名思义,行与行之间、单词与单词之间等等,都是边界在起着做用。边界又叫作断言 Assertion,也就是将大段的言语或者小段的言词断开的东西。
话很少说,先上代码。
 
3.1.【^How, *Country\.$】
 
>>>显然这个表达式是匹配这么一个内容:以How搭配一个逗号开头,中间字符任意,再以Country搭配一个点号结尾。
点号前面的那个斜杠是起的将点号这一通吃的大英雄转义从而只识别出点号(也就是做为一句话的结束的标点符号)的做用。
其中,脱字符“^”即是行起始符啦,它就是行开始的边界;而美圆符“$”即是行结束符,是行结束的边界。无需赘言。另外,脱字符与美圆符这样的断言,又被称为锚位符 Anchor,意为锚定一个起始或者结束的位置的符号,起着与海船上的锚同样的重要做用。
那么给这个表达式加上脱字符与美圆符有什么用处呢?
那就是将一行给匹配出来,是的,只匹配一行!若是咱们不用行起始与结束符,那么若是存在首段首与尾段尾都符号模式的状况,则整个文档都会被匹配到。
固然啦,咱们通常使用脱字符和美圆符来将匹配限定到行的时候,还须要勾选另一个选项:多行 Multiline。缘由也很好理解,若是不勾选多行,那工具不就自动认为咱们须要将整个文档做为一行来进行匹配、从而可能从全文来匹配嘛?此种状况下,Global能够勾选也能够不勾选,无甚差异。
 
3.2.【\bthe\b】
 
>>>\b是对单词边界的匹配,它属于零宽度断言 Zero-Width Assertion,也就是不会占用位置不占用空间的绿色环保的符号,哈哈~
这里,表达式匹配的就是一个the单词,若是是“I Love Miss Liu, the beautiful girl in my Life. I bought a ring, then I'll give it to her."则里面Miss Liu后面的the咱们能够匹配出来,但那个then,虽然也是有the,但是因为其后面并不是一个边界,而是仍有字符存在,故而不对其匹配。
 
3.3.【\Be\B】
 
>>>显然\B是对\b的取反,也就是匹配非单词边界,好比单词或字符串中的字母、数字等。这个代码中,将会对存在于单词、字符串中的非开头和结尾的e进行匹配,固然了,它只匹配e这么一个字母,而不会将其旁边的其余字符匹配。
 
3.4.【\Q.^$*+|?(){}[]\-\E】
 
>>>上面这个表达式是否是看起来很凌乱?那就对了。当咱们须要大段的输入一些要么很凌乱、要么是正则使用的符号(如^或者*)等的时候,若是一个一个地添加转义字符,那岂不是特别累!这个方法,就是用来对大段的字符进行转义的。把字符放入\Q与\E中间便可,多简单呀~
经过这个方法,咱们就能够轻松地使用元字符(还记得元字符吧?哈哈)的字面值啦。
 
接下来咱们来说一下如何为一个纯文本添加Html标签,学会了这个,之后若是要作网页那可就轻松地多了。
 
首先咱们打开RegEx网站,而后在第二个文本框中输入“这是一个实例文件,用来演示添加Html标签的。”,而后在第一个文本框中输入表达式“^(.*)$”(也就是匹配整行),再在第三个文本框中输入:
 
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
【此处须要插入图片 Html替换标签代码】
这样就完成了一个对标题的标签添加,所用的知识,其实咱们在先前也已经接触过了,就是边界、捕获分组以及后向引用啦。下面将截图贴在下面:
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 演示标题插入】
是否是以为很简单呢?其余Html文档的部分也是能够经过这样的方式来实现相应的标记的添加的,具体请自行根据实际状况进行摸索。
 
接下来咱们总结下,咱们在这第3章中学习了哪些东西:
 
*  边界(或称断言)到底是什么?
*  脱字符与美圆符做为边界起着什么做用?锚位符是什么?
*  Multiline是什么?它有什么做用?
*  单词边界与非单词边界起着什么做用?
*  如何轻松地大段使用元字符?
*  如何用正则表达式将纯文本转化为Html文本?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
3.1.【^How, *Country\.$】
3.2.【\bthe\b】
3.3.【\Be\B】
3.4.【\Q.^$*+|?(){}[]\-\E】
 

 
第4章  选择、分组和后向引用
 
在本章,咱们会更多地使用选项(好比咱们前面已经接触过的Dotall、Global、Multiline),所以,咱们仍是先交代下要使用的工具为妙。
在本章的练习,尽可能在RegExr网站来进行。
一样的,话很少说,咱们先上代码:
 
4.1.【(the|The|THE)】
 
>>>这个表达式是让工具将符合模式中这三种样式的都给匹配来:the、The和THE。其中,竖线符“|”表示选择,即从给出的模式中选择一个出来,通常工具是按照从左到右的方式来匹配的,也就是说会先在文本中检索是否有the,若是没有,那就再检索The,再没有,就检索THE,直到找到一个符合的为止,固然啦,全都找到也是能够的。
 
>>>事实上,咱们会发现,这么三个词,主要的差异也就是单词字母的大小写而已,若是就为了这么一个简单的问题就要写一大串的表达式,也未免过于冗长。因此工具提供了另外一种小药丸给咱们,可让咱们轻松许多:忽略大小写   Ignore Case。
 
4.2.【the】
 
>>>此时若是咱们勾选了Ignore Case,那么只要键入这么一个简单的表达式就能够实现代码3.1的功能了,你能够亲手去实践一下。
 
下面咱们再来介绍一个重要的概念。
子模式 Subpatattern,是指分组中的一个或者多个的分组,咱们彻底能够把子模式理解为分组中的分组、模式中的模式。抽象吧?咱们来用3.1的代码来解释一下。
(the|The|THE),就是一个分组,这个分组当中又嵌套着3个分组,因此咱们能够将the、The和THE都叫作子模式,他们的父模式就是用括号括起来的这么一个模式。
上面这样的子模式,根据可否匹配到第二个子模式(也就是The)是否取决于第一个子模式(即the)的匹配,咱们能够将其称做“不依赖型子模式”,也就是说,无论文本中有没有the存在,只要存在第二个子模式The,那么就必定能将The匹配到。
下面介绍一个“依赖型子模式”。
 
4.3.【(t|T)h(e|eir)】
 
>>>代码3.3中一共存在两个子模式(固然啦,这两个子模式之中又分别有两个它们各自的子模式),第二个子模式(e|eir)可否获得匹配,就必须看第一个子模式(t|T)可否获得匹配。好比说,若是文本中存在the,那么第二个子模式就能够匹配到,若是文本只有ahe,bhe...zhe,惟独就是没有the和The,那么第二个子模式纵然是在文本中存在,也没法获得匹配。
这就是依赖型的子模式啦~
 
括号对于子模式而言并不是必须的。咱们再来看下面的代码:
 
4.4.【\b[tT]h[ceinry]*\b】
 
>>>这个模式存在两个子模式,并且有单词边界,因此最后其可能匹配出来的结果会有:the The thee thy thence等单词。
 
>>>从代码3.4咱们发现,字符组其实也是能够做为子模式来使用的。鉴于字符组所起的做用与子模式无异,故而本书做者认为彻底能够将字符组归于子模式之行列,笔者也认为是能够的,毕竟只要咱们能切实地使用上,管它姓资仍是姓社?
 
前面咱们大量的介绍了捕获分组,可是咱们却没有对他作一个全面的审视,如今是时候给他作个CT,看看他哪里好、哪里坏啦!
 
捕获分组由于要先将壮丁抓住,而后把它给关在咱们的房间中,因此必然会挤占咱们本就不算太大的空间,为此,咱们要抓壮丁的活动就不免由于腾挪不便而颇受掣肘。
通俗的说就是,捕获分组要将数据抓取而后暂时存储在内存中,以便后续的调用(即后向引用),因此会占用内存,进而影响到性能。因此,虽然捕获起来对后向引用非常方便,但若是咱们根本就不打算在往后用上他,那就干脆别捕获啦!为此,正则表达式中特地弄出了一个替代选择:非捕获分组 Non-Capuring Group。下面咱们用代码来解释一下:
 
4.5.【(?:the|The|THE)】
 
>>>为分组的开头添加一个问号和冒号,就至关于给工具一个提示:记住了,我要把这个分组给匹配出来,但我不要你把他们都抓住,由于这样我速度贼慢,我可受不了!
如今是否明白了什么叫非捕获分组了呢?不明白不要紧,往后你会理解的。
 
4.6.【(?>the|The|THE)】
 
>>>在分组的开头添加一个问号喝大于号,实际上就是使用了一个原子分组 Atomic Group,这原子分组也是非捕获分组的一员,不过呢,他能够将回溯操做关闭掉,也就所以能够提高运行的性能了。固然啦,这个咱们仍是没必要太多关注的,起码目前来讲是这样的,毕竟这应该是那些高级人员才须要去完善的“细微末节”。
另外,关于这里提到的回溯操做,我回在后续的内容中解释给你们。
 
接下来咱们总结下,咱们在这第4章中学习了哪些东西:
 
*  如何用竖线符进行选择操做?
*  子模式是什么?它分别有哪两个类型?
*  字符组是子模式吗?
*  捕获分组有什么地方“很差”?
*  非捕获分组是什么?要怎么样去使用它?原子分组是什么?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
4.1.【(the|The|THE)】
4.2.【the】
4.3.【(t|T)h(e|eir)】
4.4.【\b[tT]h[ceinry]*\b】
4.5.【(?:the|The|THE)】
4.6.【(?>the|The|THE)】
 

 
第5章  字符组
 
字符组有时也被称做方括号表达式  Breaketed E^x^p^r^e^ssion。
 
5.1.【a-f】
5.2.【3-6】
 
>>>代码5.1匹配的是从a到f的字母,代码5.2匹配的是从3到6的数字,很简单是吧?这说明你前面的基础夯地很实哦,鼓励一下!
 
下面咱们来试着匹配从10到19的偶数。
 
5.3.【\b[1][24680]\b】
 
>>>是否是也以为是个小Case?哈哈,那我只能说你的基础可真牢!点赞。
 
下面咱们再作延伸,如何匹配0到99的偶数呢?
 
5.4.【\b[24680]\b|\b[1-9][24680]\b】
 
>>>想必理解起来也不会有多大的难度吧?重要的是想象力,哈哈~没有你抓不到的壮丁,只有你想不到的抓壮丁的套!
 
5.5.【[\w\s]】
5.6.【[_a-zA-Z \t\n\r]】
 
>>>从代码5.5咱们能够发现,字符组中也是可使用简写式的,5.5的做用就等同于代码5.6。
 
5.7.【[^aeiou]】
 
>>>用脱字符在字符组中取反,这个咱们也学过,如今你还记得吗?若是忘了的话能够回过去再复习下,这但是颇有用的哦。
 
5.8.【[0-3[6-9]]】
 
>>>是的,你没有看错,字符组之中竟然嵌套了一个字符组!这是搞啥呢?
上面的代码5.8的做用是匹配[0 1 2 3 6 7 8 9],是否是发现了什么?没错,就是取并集呀!记住哦,嵌套使用字符组,便可取并集哦。
 
5.9.【[0-9&&[^4-5]]】
 
>>>代码5.9就是取差集的表达式啦,实际上就是减的操做,不过就是要多加上两个&而已。
上述代码5.9的做用与代码5.8同样哦,不知道你可猜对了呢?
 
其实后面还有一个知识点,POSIX字符组,可是鉴于不是特别经常使用和实用,因此笔者认为无需过多关注,故而不予陈述 ,若读者有兴趣,大可于互联网上搜索来学习。
 
接下来咱们总结下,咱们在这第4章中学习了哪些东西:
 
*  如何匹配0到99的偶数?
*  怎样实现字符组取反呢?
*  如何给字符组取并集?
*  如何给字符组取差集?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
5.1.【a-f】
5.2.【3-6】
5.3.【\b[1][24680]\b】
5.4.【\b[24680]\b|\b[1-9][24680]\b】
5.5.【[\w\s]】
5.6.【[_a-zA-Z \t\n\r]】
5.7.【[^aeiou]】
5.8.【[0-3[6-9]]】
5.9.【[0-9&&[^4-5]]】

 
第6章  匹配Unicode和其余字符
 
鉴于该章节内容不甚实用,且较为繁杂艰涩,不予讲述,若读者有兴趣,不妨自行检索学习。
 

 
第7章  量词
 
前面咱们提到的量词有哪些呢?还记得那三个为虎做伥的小能手吗?分别是问号、加号和星号。接下来咱们给他们作一个传记。
 
7.1.【9.*】
 
>>>星号量词,咱们都知道是能够匹配任意个字符的。但其实它自己是贪心的 Greedy,每一次匹配它都会先将所有文本都“吃下去”,若是将须要匹配的字符串找到了,那就会将结果返回给咱们,但若是没有找到,它就会将刚刚一口气吃下去的文本都给“一点一点地吐出来”(有没有感受很像骆驼的胃?哈哈),再从吐出的内容中寻找,直到找到或者真的找不到,才会放弃寻找了。事实上,这个过程就是咱们在先前说起但未展开的回溯操做。回溯,也就是从开头跑到了终点,但是由于没有在旅途中找到须要的东西,因此又从终点跑回开头再次寻找(是否是跟咱们丢了东西后去一个地方反复寻找的状况非常相似?哈哈)。
 
>>>尽管回溯操做有助于将咱们须要的东西找到,但回溯操做却也有着极大的局限,那就是性能的拖慢,这也很好理解,就比如咱们去找东西,若是咱们反反复复地在一个地方来回寻找,固然比起只是从这个地方找了一遍就不找了要花更多的时间啦。
 
7.2.【5?】
7.3.【5??】
 
>>>代码7.2是要查找0个或者1个数字5,因此若是文本中存在数字5,那么就会自动将5给匹配出来
 
>>>但是代码7.3却不会这样,它的结果就是,就算文本中存在数字5,他也不给你找出来。是否是以为他很懒?没错,问号就是懒惰的,若是有的选择,他就会选择最少的那个来作,哈哈~
下面咱们再来经过几个代码来加深一下懒惰的问号是怎么样的。
 
7.4.【5+?】
7.5.【5*?】
7.6.【5{2,5}?】
 
>>>代码7.4中,因为加了一个问号,使得5+变成了懒惰的匹配了,因此本来是要匹配1个或一个以上的数字5的,马上就变得只能匹配出一个5,就是由于懒惰的量词选择了最省事最轻松的匹配(即此处的匹配1个)
 
>>>代码7.5中,也是由于懒惰量词,因此最后只能匹配到0个5,由于星号是让匹配0个或更多个的,既然能够匹配0个,那么懒惰的量词就干脆只匹配零个就交差了事啦
 
>>>一样的道理,代码7.6就只能匹配到2个数字5啦
看到这里,想必你对懒惰量词应该有了必定的了解了吧?
 
下面介绍另外一种量词,它但是和星号持相反政见的政敌哦。
 
7.7.【0.*+】
7.8.【.*+0】
 
>>>键入代码7.7,你会发现以0开头的全部的数字都被选中了,是否是以为很星号其实仍是同样同样的?且日后看。
 
>>>再键入代码7.8,你会发现竟然没有任何结果被匹配出来!这是为何呢?
缘由就出在以加号结尾的量词是占有欲很强的,一旦吃进了他肚子里,再想让他像贪心量词同样再吐出来从新搜索一遍,那几乎是不可能的,“凡是进了个人肚子的,就是个人了,休想让我再吐出来,哼!”这就是加号占有量词的心声,哈哈~
因为键入代码7.7以后,咱们已经让所有文本都被加号吃进了肚子,此时再键入代码7.8要查找的话,就没办法了,由于他已经把全部文本都吃进去了,再也不让咱们再匹配了,因此也就天然没有匹配的结果给咱们返回啦。
之因此会吃进去就再也不吐出来,实际上是由于他不会进行回溯操做,因此,天然加号即是星号的政敌啦!哈哈,这样想会不会脑洞有点大?(“这位做者,这样污蔑咱们俩,我和你什么仇什么怨?”加号和星号如此腹诽笔者道。)
 
7.9.【7{1}】
7.10.【7{1,9}】
7.11【7{1,}】
 
>>>这里咱们又看见了特定次数量词匹配的身影啦,呃?不对,怎么后面来了一个奇奇怪怪的哥们?代码7.11你给我出来!干吗呢你?怎么不符合规范啊?你的上界哪去了?被你吃了??
其实呀,代码7.11虽然看似在逗号后面没有上界,但实际上也是有一个上界的,那就是数学上的无穷大,哈哈,也就是说,这哥们的上界就是——无上界!瞧瞧,口气多大呀,哈哈,让咱们来看看代码7.11到底匹配的是什么?
哇塞塞,竟然能匹配自数字1以上的全部数字,厉害厉害!
 
上面咱们介绍的就是特定次数匹配的几种形式啦,读者能够自行发散开来、推而广之哦。
 
接下来咱们总结下,咱们在这第7章中学习了哪些东西:
 
*  什么是贪心量词?
*  什么是回溯操做?
*  什么是懒惰量词?
*  什么是占有量词?
*  贪心量词与占有量词有什么区别?
*  特定次数量词有哪三种形式?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
7.1.【9.*】
7.2.【5?】
7.3.【5??】
7.4.【5+?】
7.5.【5*?】
7.6.【5{2,5}?】
7.7.【0.*+】
7.8.【.*+0】
7.9.【7{1}】
7.10.【7{1,9}】
7.11.【7{1,}】
 
第8章  环视
 
环视是一种功能非捕获分组,是一种零宽度断言(还记得这个是什么吗?以前在讲到边界的时候咱们也提到了一个,若是忘记了,能够回过去看看哦),所以环视并不会“占位置”,由于它自己就是没有宽度的,哈哈,这不是废话嘛~
 
环视分为正前瞻、反前瞻、正后顾、反后顾。
 
咱们先上图,用实例来看看什么是正前瞻。以下图所示,咱们给定的文本中有许多关键词,但咱们却只想要含有必定特征的关键词,好比说这个关键词后面必须跟着一个固定的字或者前面必须跟着一个固定的字,这样的关键词,咱们才须要。这个时候,环视就颇有用处了,他能够经过后面或前面的字来匹配咱们所需的独一无二的关键词,好比我这里想要的就是后面跟着“ Is”的"Mr_Ouyang",凡是跟着其余的,都不是我想要的。

正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 正前瞻演示】
从图片中,咱们能够看出,正前瞻的代码以下:
 
8.1.【Mr_Ouyang(?= Is)】
 
>>>正前瞻,就是咱们要检索的关键词加上用括号括住的问号加等于号再加上关键词后面那个固定字符。最终它检索出来的,就是咱们检索的关键词啦,固然,它不会把后面的固定字符一同匹配出来,这就比起咱们以前学习的知识要不一样,以前的,顶多就是连固定字符一同匹配,届时还须要再将固定去掉,麻烦!
 
8.2.【Mr_Ouyang(?!Is)】
 
>>>反前瞻,一样是检索关键词,只不过此次我是不须要跟着某个固定字符的关键词了,这样咱们就可使用反前瞻,这在事实上就是对正前瞻的取反,代码8.2即是对代码8.1效果的取反。
 
8.3.【(?<=So )Handsome】
 
>>>正后顾,原理相似,只不过是根据关键词前面的固定字符来查找后面的关键词,大同小异罢了。代码8.3效果以下图所示,将前面一个单词为“So ”的关键词Handsome给匹配出来了,然后面的Handsome,因为不符合前面那个固定字符,因此没有被匹配。
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 正后顾演示】
8.4.【(?<!So )Handsome】
 
>>>反后顾,原理相似,是对正后顾的取反。代码8.4的效果是对代码8.3的取反。
 
其实环视仍是很好理解,并且仍是颇有做用的。那么它有什么用呢?
如今,你是办公室一个小职员,办公室主任扔给你一个任务:那个小欧啊,赶忙的,如今这份公司高层会议的会议记录给你,你给我赶忙把里面Mr_Ouyang老总的发言都给我找出来,急用!记住了,别漏了哦~
拿到任务一看,傻眼了,会议记录一共一百多页,天!
其实大可没必要如此煎熬,用文字扫描工具将会议记录扫描为文字,尔后将全部文字用正则匹配,下面作个演示,打开雪炭工具网页,检索:Mr_Ouyang(?=说).*。具体以下图所示:
正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang
 
 
【此处须要插入图片 环视截取演示】
 
或者,还能够用来在老师给出的课件或者其余文本中找关键词及相应解释文段,牛气吧?哈哈~
 
接下来咱们总结下,咱们在这第7章中学习了哪些东西:
 
*  什么是正前瞻?
*  什么是反前瞻?
*  什么是正后顾?
*  什么是反后顾?
*  环视能够在实际生活中如何应用?
 
下面将利用雪炭工具得到的代码所有贴到下方,以便回顾所学:
 
8.1.【Mr_Ouyang(?= Is)】
8.2.【Mr_Ouyang(?!Is)】
8.3.【(?<=So )Handsome】
8.4.【(?<!So )Handsome】
 
 
第9章  用Html标记文段
 
鉴于该章节与前述相比并没有新知识点,只不过是介绍了几个用来进行正则表达式检索的工具如Sed、Perl等,并介绍使用它们来进行纯文本的Html标记添加,与咱们目前的使用并没有太大关联,故而不予陈述。
 
 
第10章  初级班毕业了
 
本章讲的是,咱们经过前面9个章节的学习,已经大体掌握了正则表达式的基本用法,至于进阶或者高级用法,便须要咱们在往后的实践中遇到难题并进行相应学习来提升了。这一点,笔者非常赞同,就是须要实践驱动!
 
以前许多人便宣称,要想成功,最好的老师就是兴趣,你必需要培养起对他的兴趣,只有这样你才有动力去学,才能成功。
 
笔者以前也是如此认为的,但如今却不敢再苟同之。
 
笔者觉得,真正让你走向“成功”的,恐怕并不是兴趣,而是需求。兴趣,是让你想要去提升,自觉地想要去完善本身;而需求,是让你不得不提升,虽然是被迫、但却很高效的能促使你完善本身。
 
基于此,笔者提倡,若是要学习一门技术或者说知识,大可没必要等所有都掌握了再去实践,彻底能够在掌握了基础后便去用此技术、知识去闯荡,直到闯到一个程度、遇到你的瓶颈,再去充电,专门性的去学习,这样想必会更加有助于你的自我完善。固然,笔者本身也在如此地实践。
 
最后,三天的写做终于完成了,想笔者这本书才看一天,结果竟然断断续续地写了3天才将本文写完,真是不易。本来是兴致勃勃的,尤为是看到有一些读者看见本文,并予以必定互动,让笔者顿时鸡血满满,心中极其享受本文的写做。但是后面慢慢的就由热转凉,一方面是由于天天上课的时间比较多,另外一方面是互动渐少,兴趣也便冷了下来,再加上笔者愈发以为须要打好基础,因此想要多看看书,而不是看一本书就写一篇文(虽然笔者觉得这样作着实颇有帮助),因此到最后,就是抱着赶忙将本文完结,而后就暂时不写博客了,待这回多看些书,往后再回来写,想必那时笔者该有一个蜕变了罢?
 
我很期待...
 
Mr_Ouyang
2017-11-16 21:28
 
最后,将本文出现的全部代码都附在下面,以便学习巩固(想必你还记得咱们以前每个章节后都会附上章节代码吧?这样的话,匹配出来的全部代码岂不是会重复一遍吗?没错的,的确会重复,因此你猜猜看我是怎么样解决的呢?好吧,原本想装个酷的,结果很逊的是,我也解决不了,哈哈,最后百度检索了一下,找到了一个解决方法,用Notepad++,而后再替换的查找框中键入代码:^(.*?)$\s+?^(?=.*^\1$),勾选匹配新行,而后所有替换便可实现去重。正是这样的有任务驱动而后自行检索学习,一步一步地促使着咱们在技术的路上不断狂奔;经验做者也是如此,这也是他在工做中遇到需求尔后遍寻无合适之法,最后于Google中找到经验的。好啦,说了这么多,下面放代码:
 

 
1.1.【707-827-7019】
1.2.【[0-9]】
1.3.【012789】
1.4.【\d\d\d-\d\d\d-\d\d\d\d】
1.5.【\d\d\d\D\d\d\d\D\d\d\d\d】
1.6.【\d\d\d.\d\d\d.\d\d\d\d】
1.7.【(\d)\d\1】
1.8.【(\d)0\1\D\d\d\1\D\1\d\d\d】
1.9.【\d{3}-?\d{3}-?\d{4}】
1.10.【(\d{3,4}[.-]?)+】
1.11.【(\d{3}[.-]?){2}\d{4}】
1.12.【^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$】
 
--------------------------------------------------------------------------------------------------
 
2.1.【\d】
2.2.【[0-9]】
2.3.【[0123456789】
2.4.【[01]】
2.5.【\D】
2.6.【^0-9】
2.7.【^\d】
2.8.【\w】
2.9.【_a-zA-Z0-9】
2.10.【\W】
2.11.【^_a-zA-Z0-9】
2.12.【^\w】
2.13.【\s】
2.14.【 \t\n\r】
2.15.【\S】
2.16.【^ \t\n\r】
2.17.【^\s】
2.18.【........】
2.19.【.{8}】
2.20.【\bL.{2}e\b】
2.21.【.*】
2.22.【^\n】
2.23.【^\n\r】
 
--------------------------------------------------------------------------------------------------
 
3.1.【^How, *Country\.$】
3.2.【\bthe\b】
3.3.【\Be\B】
3.4.【\Q.^$*+|?(){}[]\-\E】
 
--------------------------------------------------------------------------------------------------
 
4.1.【(the|The|THE)】
4.2.【the】
4.3.【(t|T)h(e|eir)】
4.4.【\b[tT]h[ceinry]*\b】
4.5.【(?:the|The|THE)】
4.6.【(?>the|The|THE)】
 
--------------------------------------------------------------------------------------------------
 
5.1.【a-f】
5.2.【3-6】
5.3.【\b[1][24680]\b】
5.4.【\b[24680]\b|\b[1-9][24680]\b】
5.5.【[\w\s]】
5.6.【[_a-zA-Z \t\n\r]】
5.7.【[^aeiou]】
5.8.【[0-3[6-9]]】
5.9.【[0-9&&[^4-5]]】
 
--------------------------------------------------------------------------------------------------
 
7.1.【9.*】
7.2.【5?】
7.3.【5??】
7.4.【5+?】
7.5.【5*?】
7.6.【5{2,5}?】
7.7.【0.*+】
7.8.【.*+0】
7.9.【7{1}】
7.10.【7{1,9}】
7.11.【7{1,}】
 
--------------------------------------------------------------------------------------------------
 
8.1.【Mr_Ouyang(?= Is)】
8.2.【Mr_Ouyang(?!Is)】
8.3.【(?<=So )Handsome】
8.4.【(?<!So )Handsome】