正则表达式(二)—匹配次数的正则

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

正则表达式 

匹配次数的正则


在前一篇文章中,我们总结了和位置相关的正则,在这篇文章中,我们将继续学习正则表达式其它的内容。


假如现在给你一个regular_1.txt文件,让你找出含有连续2个a的行,应该怎么查找?这还不简单嘛,cat  regular_1.txt  | grep "aa" ;很好,现在换成另一个问题:找出含有连续100个a的行 。难道在命令中连续写上100个a ?显然太累人了。


我们完全可以利用正则解决上面这个问题,这就是这篇文章主要讲述的内容。老规矩,还是先给出测试需要用到原始文件的内容。


正则表达式(二)---匹配次数的正则


1
{m}

{m} 表示匹配前面字符m次,也就是说前面字符出现m次的行会被匹配,好了,实验一把吧,查找regular_1.txt 文件中a连续出现2次的行。

正则表达式(二)---匹配次数的正则

看到没,好家伙,一下输出了这么多行,只要是连续出现了2次a以上的行都会被匹配上,这个世界究竟怎么了?我明明只是想要连续出现两次a的行就可以了,干嘛给我返回这么多。其实很简单。连续3个a就已经包含了连续2个a,肯定能匹配上。再看看第5行,连续4个a包含了2次连续2个a,相当于第5行匹配上了2次。

现在我们可以很轻松的写出下面这样的命令来找出文件中含有连续100个a的行  :

cat  regular_1.txt  | grep "a{100}"  


2
{m,}

{m,} 至少匹配前面字符m次,好了, 我们再来查找regular_1.txt 文件中a连续 出现2次以上的行。 

正则表达式(二)---匹配次数的正则

咋一看,好像和上面的输出结果没什么区别啊,但是仔细看看第4、6行,还是有些许不同的,以第3行为例,{2}形式匹配的时候第3行被匹配上是因为连续包含了2个a被匹配上,因此输出中最后的a没有颜色;而{2,}形式第3行被匹配上是因为连续包含了3个a才被匹配上。果相同但因却不一样。


3
{m,n} 

{m,n} 匹配前面字符 最少m次,最多m次都可以,好了, 我们再来查找regular_1.txt 文件中a连续 出现2次到3次的行。  

正则表达式(二)---匹配次数的正则

至于第6行含有连续5个a为什么能被匹配上,通过前面的分析我想大家应该知道原因吧。


4
*

*表示其前面的字符连续出现任意次,这个任意当然包括0次了,也包括多次,好了,现在我们用*来匹配测试下。

正则表达式(二)---匹配次数的正则

正则表达式(二)---匹配次数的正则

可以看出,原始文件中无论有多少个a都被匹配出,尽管第1行不含a字符,但还是匹配出来了。


5

?表示其前面的字符连续出现0次或者1次,下面我们用它来匹配regular_1.txt文件中出现0次或者1次的行。

正则表达式(二)---匹配次数的正则

看到上面的结果吗,竟然和*匹配的结果是一样的,尽管结果一样,但是匹配的原理是不同的。以第3行为例,如果使用*匹配,则第3行是以因为其连续含有2个a被匹配上的;而如果是以?匹配,则第3行被匹配上是因为先匹配了上1个a,再匹配上后面的a,相当于匹配上了2次。所以有时候看事务是不能只看表面的。


6
+

+ 表示其前面的字符连续出现1次或者多次,也就是说,+前面的字符至少要连续出现一次才能匹配上。如果我们需要查找文件中出现过a字符的行,我们可以使用下面的命令。

正则表达式(二)---匹配次数的正则


总结

主要总结了正则表达式中关于次数匹配相关的正则,后面还会总结正则表达式其它的规则,希望对大家有所帮助,文章中如有遗漏或错误之处,还望大家指出!



推荐阅读:

【Linux命令】 grep命令基本用法

正则表达式(一)---位置锚定




专注服务器后台技术栈知识总结分享

欢迎关注交流共同进步

正则表达式(二)---匹配次数的正则