**正则表达式 **
匹配次数的正则
在前一篇文章中,我们总结了和位置相关的正则,在这篇文章中,我们将继续学习正则表达式其它的内容。
假如现在给你一个regular_1.txt文件,让你找出含有连续2个a的行,应该怎么查找?这还不简单嘛,cat regular_1.txt | grep “aa” ;很好,现在换成另一个问题:找出含有连续100个a的行 。难道在命令中连续写上100个a ?显然太累人了。
我们完全可以利用正则解决上面这个问题,这就是这篇文章主要讲述的内容。老规矩,还是先给出测试需要用到原始文件的内容。
{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}” **
{m,} 至少匹配前面字符m次,好了,** 我们再来查找regular_1.txt 文件中a连续 出现2次以上的行。 **
咋一看,好像和上面的输出结果没什么区别啊,但是仔细看看第4、6行,还是有些许不同的,以第3行为例,{2}形式匹配的时候第3行被匹配上是因为连续包含了2个a被匹配上,因此输出中最后的a没有颜色;而{2,}形式第3行被匹配上是因为连续包含了3个a才被匹配上。果相同但因却不一样。
{m,n} 匹配前面字符 最少m次,最多m次都可以,好了,** 我们再来查找regular_1.txt 文件中a连续 出现2次到3次的行。 **
至于第6行含有连续5个a为什么能被匹配上,通过前面的分析我想大家应该知道原因吧。
表示其前面的字符连续出现任意次,这个任意当然包括0次了,也包括多次,好了,现在我们用来匹配测试下。
可以看出,原始文件中无论有多少个a都被匹配出,尽管第1行不含a字符,但还是匹配出来了。
?表示其前面的字符连续出现0次或者1次,下面我们用它来匹配regular_1.txt文件中出现0次或者1次的行。
看到上面的结果吗,竟然和匹配的结果是一样的,尽管结果一样,但是匹配的原理是不同的。以第3行为例,**如果使用匹配,则第3行是以因为其连续含有2个a被匹配上的;而如果是以?匹配,则第3行被匹配上是因为先匹配了上1个a,再匹配上后面的a,相当于匹配上了2次。**所以有时候看事务是不能只看表面的。
+ 表示其前面的字符连续出现1次或者多次,也就是说,+前面的字符至少要连续出现一次才能匹配上。如果我们需要查找文件中出现过a字符的行,我们可以使用下面的命令。
主要总结了正则表达式中关于次数匹配相关的正则,后面还会总结正则表达式其它的规则,希望对大家有所帮助,文章中如有遗漏或错误之处,还望大家指出!
推荐阅读:
专注服务器后台技术栈知识总结分享
欢迎关注交流共同进步