2019-06-13-正则表达式基础入门

什么是正则表达式

简单地说,正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。可能通过这句话大家还是不明白什么是正则表达式,这里我也就不罗列正则表达式的定义了,反正就是罗列了,你还是不明白。我们通过一个例子来说明:

首先,我们在Notepad++中建立一个文本,名字随便起,在文中添加如下三行内容:

这时,我们需要搜索这个文本文件中的kkutysllb这个单词,很简单,通过ctrl+F快捷键打开搜索栏,输入kkutysllb即可,如下:

根据搜索结果,我们找到了3个kkutysllb字符组。那么,这时我们需求变一下,需要查找以kkutysllb开头的文本,我们如何查找?眼睛不瘸的你一定发现了,Nodepad++搜索栏中有“正则表达式”字串!!!

所以,我们开心的再次Ctrl+F打开搜索栏,选中正则表达式,在目标栏中输入^kkutysllb,点击查找所有,即可满足我们的需求。

是不是很神奇?这就是正则表达式存在的意义,我们可以把上面^kkutysllb看做一个正则表达式(本来就是),这个正则表达式的意思就是“以kkutysllb开头的行”

到目前为止,我们已经初步接触到了正则表达式,现在让我回过头来看看开头那句话—简单地说,正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。现在,你是不是就理解一点儿了?其实,正则表达式在编写程序时经常会用到,因为我们写的代码程序主要用来处理各种数据和文本,有了正则表达式可以让程序代码足够精简且强大。同时,在Linux的文本处理三剑客中也会经常用到正则表达式(后面会专门讲三剑客工具),通过正则表达式可以将复杂的处理化繁为简,提高运维脚本编写效率,而且在Linux运维工具中只有三剑客工具支持正则表达式。

最后,我们正式给出正则表达式的官方定义:正则表达式,又称规则表达式,英文为Regular Expression,常简写为regex,regexp或RE。正则表达式是计算机科学的一个概念,通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式入门

为了让大家对Linux中使用正则表达式有个感性认识,我们需要借助一个常见的命令grep来讲述。至于grep是个啥?大家暂时把他理解成一个搜索工具即可,详细用法后面会有一篇专门介绍grep的文章。现在,大家暂时“照猫画猫”跟着我做就行。

当grep与正则结合时,可以说是如胶似漆。。。不对,应该严肃点儿说是。。。如鱼得水!!!grep会根据“正则的含义”在文本中搜索符合条件的字符串。我们首先在目录下创建一个测试文件test,写入如下内容:

1
2
3
4
5
6
7
8
9
[root@c7-test01 ~]# cat test 
kkutysllb
I Love kkutysllb
He is an interesting man
He is my role model
The qq number of kkutysllb is: 31468130
kkutysllb's Homepage: https://kkutysllb.cn
His common names: kkutysllb,kkutys,123kkutysllb123,kkutysllb78
kkutysllb cool

如果我们想搜索出test文件中包括kkutysllb的行,可以使用如下命令:

如上图,可以看出只要包含kkutysllb字符串的行都会被搜索出来。但是如果我们只想搜索以kkutysllb字符串的开始的行呢?这时候,正则表达式就派上用场了。在正则表达式中,^符号表示以什么字符串开头,^kkutysllb就表示以kkutysllb字符串开头。因此,为了满足我们的需求,可以使用如下命令:

那么,我们如果想查找以kkutysllb字符串结尾的行呢?可以使$符号来表示以什么字符串结尾,kkutysllb$就表示以kkutysllb字符串结尾。命令如下:

我们学会了^和$,知道它们是正则表达式中分别用于锚定行首和行尾,那么如果我们把它们结合起来使用呢?比如:^kkutysllb$代表几个意思?我们先来分下下,^kkutysllb表示以kkutysllb字符串开头,紧接着kkutysllb$代表以kkutysllb字符串结尾,也就是说^kkutysllb$代表以kkutysllb开头同时以kkutysllb结尾的字符串,也就是说整行只有kkutysllb一个字符串的场景。我们不妨验证下,命令如下:

如上图,聪明如我,果然如此!那如果符号^和$之间什么都没有呢?也就是我们要匹配^$代表什么意思?其实,^$就代表空行的意思。为了显示清楚,我们将空行的的行号打印出来,命令如下:

可以看到我们的测试文件中第9行与第10行为空行,与实际情况一样。

现在,我们已经能够灵活的锚定行首和行尾了,那么,正则表达式能不能锚定词首或词尾呢?那必须滴。。。在正则表达式中,”\<”表示锚定词首,”\>”表示锚定词尾。比如:我们想搜索单词以kkutys开头的行,命令如下:

如上图,可以看见123kkutysllb123这个单词没有被匹配到,至于它所在行被匹配输出,是因为它前后单词都是以kkutys开头的。我们再来匹配以单词cool结尾的行,命令如下:

那么,聪明如我你一定想到了,要匹配整个单词,就将”\<”和”\>”结合起来使用就行了。其实,在正则表达式中,除了使用”\<”和”\>”去锚定词首和词尾外,还可以使用“\b”去完成同样的锚定功能。验证如下:

如上图,表示搜索以123开头,同时以123结尾,中间是任意多个字母组成的单词的行。根据搜索条件,就找到了123kkutysllb123这个单词所在的行。这里的示例主要是说明“\b”可以取代”\<”和”\>”来锚定词首和词尾,在实际中shell脚本中我也建议大家这样使用。至于[a-z]*的匹配规则后面会讲到,目前入门这里不是重点。

“\b”还有一个孪生兄弟“\B”,虽然它们有“血缘”,但是“性格迥异”,也就是功能完全不一样。“\b”是用来锚定词首和词尾,换句话说也就是用来锚定单词的边界。而“\B”正好相反,它是用来匹配非单词边界的,这样说可能并不容易理解,看了底下的示例你会秒懂!!!示例如下:

如上图,它的意思是匹配非kkutysllb单词所在的行,也就是说只要该行中存在不是以kkutysllb作为词首和词尾,而是作为中间内容的单词,就会匹配输出。至于“\B”匹配词首或词尾的用法,聪明如我你一定会掌握,这里不再赘述。

小结

通过上面的示例,大家可能发现我们使用的都是与“位置”有关,比如“行首、行尾、词首、词尾”等,我们可以把上面是示例中用到的符号归纳为“位置匹配”有关的正则表达式符合,我们不妨做个总结,便于以后查询。这些“位置匹配”相关的符号包括:^、$、\<、\>、\b、\B。

^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。

$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。

^$:表示匹配空行,这里所描述的空行只表示回车符,而空格和tab键制表符等只能算空字符串,不能当做空行处理。

^abc$:表示abc独占一行的场景才会被匹配到。

\<或者\b:表示锚定词首,其后面的字符必须作为单词首部出现才能被匹配。

\>或者\b:表示锚定词尾,其前面的字符必须作为单词尾部出现才能被匹配。

\B:用于匹配非单词边界,与\b是“性格迥异”的亲兄弟。

在正则表达式中,包含基础正则表达式扩展正则表达式两种,大家暂时不用纠结,后面会有专门总结扩展正则表达式的文章。我们现在主要需要掌握的都是基础正则表达式,只要学会了基础正则表达式,掌握扩展正则表达式只是分分钟的事情。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!