1 什么是正则表达式

正则表达式(REGEXP:REGular EXPression)正则表达式里面的字符不是做本身的意义,通常是做通配,锚定的等特殊意义;并且比通配符更能精确的描述检索文本的需要。它是对字符串操作的一种逻辑公式,通俗的说就是对字符及很多字符的组合结合自身法则组合成一个规则的字符串(即过滤条件)通常把这些由字符或者是正则表达式的字符组合起来的过滤文本过滤条件叫做模式(pattern)。

正则表达式主要应用在文本方面,可以方便的处理文本内容,实现我们对查找一些文本内容的需要;正则表达式灵活性、逻辑性和功能性很强,它的都是由一些普通字符(包括大小写的字母和数字和一些元字符(由特殊字符组成)
2 grep简介
grep:使用基本正则表达式定义的模式来过滤文本的命令,并将符合模式的文本行显示出来(做部分匹配,匹配时整行有部分被匹配到时,显示整行)egrep是grep的扩展,支持扩展正则表达式的元字符
grep常用选项:
-i:不区别大小写
--color查找出来的颜色显示
-v:显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
—E:使用扩展正则表达式
 -A:当某一行被grep命令匹配到以后,不但显示这一行还可以显示这一行后面的多少行,后面通常跟数字,显示匹配到匹配到的这一行的后面那几行(即数字是代表行数的)
-B:与-A相似后面通常跟数字显示匹配到的这一行的前面那几行(即数字是代表行数的)
-C:与-A相似后面通常跟数字显示匹配到的这一行的前后那几行(即数字是代表行数的)
 
3 正则表达式的分类及字符介绍
3.1 正则表达式的分类

正则表达式分为两类分别是:(1)基本正则表达式----Basic REGEXP  (2)扩展正则表达式----Extended REGEXP 

3.2 正则表达式的字符
3.2.1 基本与扩展字符共同之处
(1)字符匹配

.:表示匹配任意单个字符 例如:grep “.a.” 表示查找字母a有带有个字符如同 a1 ab ar a0等

[]:表示匹配指定范围内的任意单个字符 例如:grep “[:space:]” FILE查找带有空白符的文本行

[:space:]表示所有的空格字符
[:punct:]标点符号集合
[a-z]或[:lower:]:小写字母
[A-Z]或[:upper:]:大写字母
[:slpha:]:大小写字母
[0-9]或[:digit:]:数字
[:alnum:]:数字和大小写字母
 [^]:表示指定范围以外的任意单个字符 例如:grep  “[^[:space:]]” FILE查找带有非空白符的文本行
(2)次数匹配:
 *:表示匹配其前其前面的字符0次一次或多次 例如:grep “b*” FILE 查找带有b字母并且后带有任意个b的文本行
\?::表示匹配其前面字符0或1次 例如:grep “ab\?” FILE 查找带有ab字母并且b后又跟一个或0个b的文本行

.*:用于基本正则表达式,表示任意长度的任意字符 例如:grep  “a.*” FILE字母a后跟任意字符的文本行

(3)位置锚定
^:锚定行首,此字符后面的任意内容必须出现在行首 例如:grep  “^h”  FILE 查找以小写字母h开头的行
   $:锚定行尾,此字符前面的任意内容必须出现在行尾 例如:grep “h$”  FILE 查找以小写字母h结尾的文本行
   ^$:空白行

   \<或\b:锚定词首,其后面的任意字符必须作为单词首部出现

    \>或\b:锚定词尾,其前面的任意字符必须为单词的尾部出现  

例如:grep  “\bhi\b”  FILE 查找带有hi单词的文本行

3.2.2 基本与扩展字符不同之处
基本正则表达式与扩展正则表达式主要体现在“字符匹配与分组”
(1)字符匹配
\{m,n\}:用于基本正则表达式,表示匹配其前字符至少m次,至多n次;当没有上限的时候可以省略不写(即n可省略),但最小值为0时不可省略(即m必须有)
例如: grep  “a\{1,5\}” FILE 查找带有小写字母a并且其后又紧跟不少于一个不大于5个的小写字母a的文本行
+:用于扩展正则表达式,匹配其前面字符至少一次 例如:grep  –E  “a+” FILE 查找小写字母a后面至少又跟一个a的文本行
(2)分组
\(\)…\(\)..\1:用于基本正则表达式做后向引用
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容
\2:引用第二个左括号以及与之对应的右括号所包括的所有内容
 \3:引用第三个左括号以及与之对应的右括号所包括的所有内容
例如:grep  “\(root\).*\(100\)\1” 查找root单词后跟任意字符后带有100数字并紧跟数字后面又带有root单词的文本行 \1引用前面第一个括号的内容;如果是grep  “\(root\).*\(100\)\2”
则是查找root单词后跟任意字符后带有100数字并紧跟数字后面又带有100数字的文本行。
 
():用于扩展正则表达式,做后向引用与基本正则表达式相比不加反斜线
()…()..\1:括号内不加反斜杠,用grep –E 或 egrep 来查找
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容
\2:引用第二个左括号以及与之对应的右括号所包括的所有内容
\3:引用第三个左括号以及与之对应的右括号所包括的所有内容
(3)“|“:代表或者的意思,用于扩展正则表达式中
 | : 表示or的意思即或
例如:A|abc :匹配的是A或者abc 匹配的是整个单词
(C|c)at:匹配大写C或小写c开头的cat