正则表达式用于处理文本,精通运用正则表达式可以有效的解决工作的效率
正则表达式有基础正则表达式和扩展正则表达式区别
grep支持基础的正则表达式,grep -E (egrep)支持扩展正则表达式
1、脱字符号(^)、美元符号($)
脱字符号和美元符号实质上匹配的是一个位置(即定位),分别锚定一行的行首(^)和一行的行尾($)
在这里详细说明一下理解正则表达式是习惯:
^hel
^锁定一行的开始,接下来是字符h,紧接着是字符e,最后是字符l
只要满足这个标准,至于小写字母 L 之后是否存在字符就不在考虑范围之内了,这样理解正则表达式就很容易了
2、字符组 []
字符组匹配的是一组字符集合中的一个字符(必须匹配到一个字符)。(字符组嵌套使用变化多)
例: gr[ea]y 意思是:先找到字符g,接下来是字符r,紧接着是字符e或者a,最后是字符y,[]内含义是或者的意思
显然,gr[ea]y 并不匹配gry,这是因为[ea]占用一个位置字符,如果没有gray或者grey,则命令反馈为空白
字符组中还包含两个元字符:-(连字符)和^(排除符号)
-(连字符)在字符组[]中只有在两个字符中间才是表示范围的意思,例:<H[1-6]>,表示匹配<H 1>、<H 2> 、<H 3> 。。。。。
同时多重范围也是允许的。[0-9A-F_!.?] 表示匹配一个数字、一个大写字母、下划线、感叹号、点、问号,字符组内的顺序无关紧要。
有人会问 ?字符(?)不是正则表达式,匹配前一个字符0个或者1个吗?怎么又是匹配?问号呢? 说明一下,字符组中符号-和^才是解释为正则表达式,其他都是普通字符
注意在字符组中,-和^也不是一定就是解释为正则表达式,位置很关键?如果-在[中括号后的第一个字符,那么就表示普通字符-,如果^不是[中括号后的第一个字符,也不表示排除的意思
第一个-连字符是解释为a到z的范围,第二个-仅仅解释为普通字符-,这样就匹配到了字符h-lo
排除型字符组(^)
[^ ]取代[ ],^在字符组内的含义是排除的意思,例[^3-6] 表示排除数字3 、4、5、6之外的所有字符,不仅包含了1、2、7.。。。数字,大小写字母,还包含了特殊字符.?!~等等
kal[^a] 匹配了kali,却没有匹配kal,这就是我之前说的字符组[]和[^]占用一个匹配位,如果kal之后没有字符是匹配情况的。
后面会结合字符组列举一些技巧
3、句点符号(.)
表示用来匹配任意一个字符,空格也可以匹配
多选结构
4、字符 | 匹配任意子表达式
利用扩展正则表达式字符 | 可以筛选多个选项。例: “Bob|Robert”注意字符 | 两边没有空格,表示包含Bob或Robert字符串的行
多选结构的正则表达式字符 | 与字符组[]相似,字符 | 有或者的含义,同时字符组[]内的字符也有或者的含义,但是也有明显的区别:字符组[]仅仅占用一个字符位,而字符 | 两边却是完整的正则表达式
一般| 都结合()一起来使用
()实际上是确定的多选的范围,所以(a|e)与[ea]效果是一样的,同时如果去除(),gre|ad 则表示包含gre或ad的行
三种表达式,反映的效果都是一样,反斜杠用于屏蔽句点符号.
至于第三个表达式,尝试用上面理解正则表达式的方式解读一下:
(Fire|l)st\.[Ss]treet 首先查找包含字符串Fire或者L(小写)接下来查找Fire后面是否紧跟字符s和t(不是就排除),或者是L(小写)后面是否是紧跟s和t,再接下来是句点,接着句点之 后是否是大写s或者小写s,大小写s之后是treet
对于^(Geo|Je)ff(rey|ery) 表示开头字符是Geo或者Je,拆开就是^Geo、 ^Je
如果是^Geoff|Jeff(rey|ery) 是表示什么呢? 匹配一行开始是Geoff的行,或者包含字符串Jeffery或Jeffery的行
5、单词分界符\<和\> 有些egre不支持单词分界符
\< 针对单词,表示匹配单词的开头字符. \<the
\> 针对单词,表示匹配单词的结尾. the\>
与^$相似,只是^$针对行,\<和\>针对单词,所以\<the\> 表示匹配单词的开头为the,结尾也是the,也就是匹配单词the,所以是精准匹配单词
END