分组引用
我们来了解一下正则中的”分组”与”后向引用”。首先来看看什么是分组?还是先看个案例:需要从某个文件中找出,"ha"连续出现2次的行。
如果想要满足我们的需求,就需要用到”分组”,将”ha”当做一个”分组”,也就是说当做一个”整体”,才可以达到我们的目的,正确的写法如下:
后向引用
介绍完了分组,我们再来看看什么是后向引用,如果对分组还没理解的同学还是建议好好回过头复习下,否则后面会完全不知道在说什么。
后向引用是以分组为前提的,只有先进行分组,才能实现后向引用。为了描述清楚什么是后向引用,我们还是先循序渐进看几个例子。
可以看到,使用正则表达式"\(h.\{3\}\)java\1"达到了我们的要求,我们来分析下这个表达式的含义:
红色部分\(h.\{3\}\):表示大写字母h的后面跟随了3个任意字符,并且字母h与后面的3个字符将作为一个整体看待。
蓝色部分”\1″:表示整个正则中第1个分组中的正则所匹配到的结果,什么意思了,拿这个例子来说,整个正则表达式只有一个分组\(h.\{3\}\), 当分组与文件第一行匹配会匹配出haha,那么\1就表示haha。当分组与文件第二行匹配会匹配出hihi,那么\1就表示hihi。也就是说,”\1″引用了整个正则中第1个分组中的正则所匹配到的结果。
上面的两个正则表达式中,都出现了两个分组,一个分组嵌套着另一个分组。红色标注的符号是一对分组符号,蓝色标注的符号是一对分组符号,红色分组嵌套这蓝色分组。
再来详细分析两个正则表达式,除了”后向引用”的数字不一样,其它都是一模一样,但是得到的结果完全不一样。
在正则表达式中,分组的顺序取决于分组符号的左侧部分的顺序,也就是说,红色标注的左侧在蓝色标注左侧的前面,所以红色标注是第1个分组,蓝色标注的是第2个分组。
理解了上面这一点,再来分析两个正则表达式就很简单了,第一个正则表达式"\(x\(yz\)ab\)\1"中,后向引用的是第1个分组,而第1个分组是外面的\(x\(yz\)ab\),它匹配到xyzab,\1表示后向引用第1个分组匹配的结果xyzab,那么整个正则表达式匹配的是xyzabxyzab。
第一个正则表达式"\(x\(yz\)ab\)\2"中,后向引用的是第2个分组,而第2个分组是外面的\(yz\),它匹配到yz,\2表示后向引用第2个分组匹配的结果yz,那么整个正则表达式匹配的是xyzabyz。
扩展正则表达式
前面我们介绍的都是基本正则表达式,其实在Linux中,正则表达式可以分为”基本正则表达式”和”扩展正则表达式”。
看到这里,有同学可能就懵了,好不容易将前面的内容理解的差不多了,你竟然跟我说还有扩展正则表达式,不过不要担心,只要你掌握了基本正则表达式的用法,我可以保证你掌握扩展正则表达式那是分分钟的事。
其实,扩展正则表达式和前面介绍的基本正则表达式的符号至少80%是一样的。
这里我们将两者不同的地方总结如下:
含义 | 基本正则表达式 | 对应的扩展正则表达式 |
匹配其前面的字符0或1次 | \? | ? |
匹配其前面的字符1或多次 | \+ | + |
匹配前面的字符连续出现m次 | \{m}\ | {m} |
匹配前面的字符至少连续出现m次 | \{m,}\ | {m,} |
匹配前面的字符最多连续出现n次 | \{,n}\ | {,n} |
匹配前面的字符连续出现至少m次,最多n次 | \{m,n}\ | {m,n} |
或 | 无 | | |
可以看到,相对于基本正则表达式,对于次数匹配的很多符号,其对应的扩展正则表达式少了前面的”\”,更加简洁了,可读性也就就变强了。
好了,重头戏来了,现在我们想要找出文件中行首以"ha"开始的行,或者行首以"hi"开始的行,这就用到了"|"。“|”在扩展正则表达式中,就表示”或”的含义,如下所示:
本文地址:百科问答频道 https://www.neebe.cn/wenda/944671_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!