一 .什么是正则表达式
正则表达式(Regular Expression,RE)就是由一系列特殊字符组成的字符串。其中每个特殊字符都被成为元字符,这些元字符并不表示他们字面上的含义,而是被解释为一些特定的含义。
正则表达式是由普通字符和元字符共同组成的集合,这个集合用来匹配(或指定)模式。正则表达式的主要功能是文本查询和字符串的操作,正则表达式可以匹配文本的一个字符或字符集合
例如,a b 1 2 等字符属于普通字符,普通字符可以按照字面意思理解,如a只能理解为英文的小写字母a,没有其他隐藏含义。而* ^ []等元字符,shell赋予了他们超越字面的意思的意义,如*符号的字面意义只是一个符号,而实际上却表示了重复前面的字符0次或者多次的隐藏含义
二 .正则表达式的组成
一个正则表达式包含下列一项或多项
- 一个字符集:这次所指的字符集只包含普通字符,这些字符只表示他们的字面含义.正则表达式的最简单形式就是只包含字符集,而且不包含元字符.
- 锚: 指定了正则表达式所要匹配的文本行中所处的位置,如^和$就是锚
- 修饰符: 它们扩大或缩小(修改)了正则表达式匹配文本的范围.修饰符包含星号,括号和反斜杠.
正则表达式中符号含义
字符 | 含义 |
* | 匹配前面一个普通字符0次或者多次 |
. | 匹配任意一个字符 |
^ | 匹配行首或后面字符的非 |
$ | 匹配行尾 |
[] | 匹配字符集合 |
\ | 转义符,屏蔽一个元字符的特意义 |
\<\> | 精确匹配符号 |
\{n\} | 匹配前面字符出现n次 |
\{n,\} | 匹配前面字符至少出现n次 |
\{n,m\} | 匹配前面字符出现n次与m次之间 |
其中:
- *用于匹配前面的一个普通字符的0次或者多次重复,例如.w*en,*符号前面的普通字符字符是w,*号字符就表示匹配w字符0次或者多次,如果字符串wen,wwen,wwwwen都可以用w*en来表示
- .用于匹配任意一个字符,例如,...69.表示前面三个字符为任意字符,第四个个第五个字符是6和9 最后一个字符为任意字符,如xcb698,gfr69p都能匹配上述字符串
- ^用于匹配行首,表示行首的字符是^字符后面的那个字符,例如: ^cloud表示匹配以cloud开头的行
- $匹配行尾,$放在匹配字符之后,例如,micky$表示以micky结尾的所有行,^$表示空行
- []匹配字符集合,在正则表达式中,将匹配中括号字符集中的某一个字符,例如:
- [xyz]将会匹配字符x,y,或z
- [c-n]匹配字符c~n之间的任意一个字符
- [B-Pk-y]匹配从B~P,或者k~y之间的任意一个字符
- [a-z0-9]匹配任意小写字母或数字
- [^b-a]将会匹配范围在b~a之外的任意一个字符.这就是使用^对字符集取反的一个实例
- 将多个中括号字符集组合使用,能够匹配一般的单词或数字,例如,[Yy][Ee][Ss]能够匹配yes,Yes,YES,yEs等
- 下面来看第一个例子
-
[root@localhost ~]# cat test aa bb cc dd ee 11 22 4 55 76 77 11 tt
[root@localhost ~]# grep "[^a-z]" test
11
22
4
55
76
77
11从输出可以看出,精确匹配了test文件中所有非字符的内容
-
- 下面来看第一个例子
- \用来转义某个特殊含义的字符.这意味着,这个特殊字符将会被解释为字面含义例如:
- \$将会解释成字符$,而不是RE中匹配行尾的特殊字符.相似的,\\将会被解释为字符\.
- 转义的尖括号\<...\>用于匹配单词边界,尖括号必须被转义才含有特殊的含义,否则他就表示尖括号的字面含义
- \<the\>完整匹配单词the,不会匹配them,there,other等.
- \{\}系列符号表示前一个字符的重复次数.
- \{n\}匹配前面的字符出现n次,如we\{3\}n匹配weeen
- \{n,\}匹配前面的字符至少出现n次,如we\{3\}n匹配weeen,weeeen,weeeeen
- \{n,m\}匹配前面字符出现n次与m次之间,如如we\{3.6\}n匹配weeen,weeeeeen等字符串
- 例如:.[a-z]\{5\}匹配五个小写英文字母,如hello,house等
- 继续看第二个例子
-
[root@localhost ~]# cat test2 test abc liveylinux rrrrrr iiiivey bkywwk yyyy1996 golang [root@localhost ~]# grep "\<test\>" test2 test abc liveylinux [root@localhost ~]# grep "r\{6\}" test2 rrrrrr [root@localhost ~]# grep "bkyw\{0,2\}k" test2 bkywwk [root@localhost ~]# grep "y\{4\}1996" test2 yyyy1996
可以看出,grep都精准匹配出来了
- 例如:.[a-z]\{5\}匹配五个小写英文字母,如hello,house等