Shell编程之正则表达式总结
正则表达式(Regular Expression)是一种文本模式,描述了一种字符串匹配模式。可以用来检查一个串是否包含有某种子串。在Linux的shell编程中广泛运用。正则表达式分为两类:基本正则表达式(Basic Regular Expression)BRE和扩展正则表达式(ExtendedRegular Expression)。
在windows/dos下,如果我们要查找所有的以.doc结尾的文件,我们通常会用通配符*.doc,在这里*会被解释成任意长度的任意字符串。这也可以说是一种匹配模式。和通配符类似,正则表达式就是用来进行文本匹配的工具,只不过比起通配符,正则表达式能更精确的描述你的需求。但是,这也是需要付出更大的代价——更复杂。
从根本上来看,正则表达式是由两个基本组成部分建立:一般字符和特殊字符。一般字符是指任何没有特殊意义的的字符。特殊字符称为元字符(mete character)。
先来看一些简单的匹配:
metechar :匹配一行上任意位置的8个字母 metechar
^metechar :以metechar开头的行
metechar$ :以metechar结尾的行
[mM]etechar :匹配一行上任意位置的metechar或者Metechar
met.char :匹配一行上任意位置包含有,met加上任意一个字符后面再接上char的,即met+单个字符+char,例如metechar,metachar……都是满足的。
met.*char :匹配一行上任意位置包含有,met加上任意个字符(0个或者n个)后面再接上char的,metammmchar,metachar,metabcdchar都是可以的。
一、基本正则表达式
习惯上的把元字符大致分为如下几类:
1.用于匹配单个字符的元字符:
.: 匹配任意的单个字符
[]: 匹配指定范围内的任意的单个字符
扩展:有时候写要匹配0到9之间的数字,可以这样写[0123456789],然而这样写太麻烦了,我们习惯上使用[0-9],同理a到g之间的字母[a-g],a到z之间的字母[a-z]。
[^]: 匹配指定范围外的任意的单个字符
扩展:字符集合:
[:digit:] 匹配数字
[:lower:] 匹配小写字母
[:upper:] 匹配大写字母
[:space:] 匹配空格
[:alpha:] 匹配大写字母和小写字母
[:alnum:] 匹配大、小写字母和数字
例:
有如下字符:
abc,abb,abdc,a123b,a1b,aAb,adfghb,abcd,abcabcabcabc,abcdcdcdab
a.b: abb
a*b:abc,abb,abdc,a123b,adfghb,abcd,abcabcabcabc,abcdcdcdab
a[[:digit:]]b:a1b
2.用于匹配次数的元字符
*: 匹配其前面的字符任意次(包括0次)
扩展: .*: 任意长度的任意字符
\?: 匹配其前面的字符1次或0次 注:”\”用作转义 !!!其前面的字符可有可无
\{n\} :匹配其前面的字符n次
\{m,n\}:匹配其前面的字符至少m次,至多n次
扩展:\{m,\} :匹配其前面的字符至少m次
例:
有如下字符:abc,abb,a1b,aAb,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb,accc,ac,accg
a.*b: abc,abb,a1b,aAb,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb
a\?b: abc,abb,a1b,aAb,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb
a\{2\}b:aabb
ac\{1,3\}:accb,accc,ac,accg
3.用于位置锚定的元字符:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行
\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
例:有一个文件内容如下
------test.file------------
Hello,every one!
This is a test file.
The next line is blank line!
He is her lover
She is his liker
The test file end!
--------End----------------
^T:以 T 开头的行
This is a test file.
The next line is blankline!
The test file end!
\.$:以 . 结束的行
Thisis a test file.
<\bl:包含有以 bl 开头的单词的行
Thenext line is blank line!
ne\>:包含有以 ne 结尾的单词的行
Hello,every one!
The next line is blank line!
<\l.*r\>:包含有以 l 开头且以r结尾的行
He is her lover
She is his liker
分组:
\(\)
前面只提到了怎么重复单个字符(直接在后面加上限定符就好了);但是如果想要重复多个字符串怎么解决?这就要用到我们分组的概念了,用小括号来指定表达式,再来指定重复的次数。
例:
ab* 表示 b可以出现任意次
\(ab\)* 表示ab可以出现任意次
例2:用正则表达式描述一个ip地址
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
后向引用:
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是分组捕获的内容)可以在表达式中或其他程序中进一步的处理。默认情况,每个分组默认拥有一个组号。规则是:从左到右,以分组的左括号为标志,第一个出现的分组为1,用\1引用,第二个为2,用\2 引用,以此类推。
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容
\2:引用第二个左括号以及与之对应的右括号所包括的所有内容
\3:以此类推……
二、扩展正则表达式
扩展正则表达式基本用法与基本正则表达式基本一样,元字符不需要转义
1.用于匹配单个字符的元字符:
.: 匹配任意的单个字符
[]: 匹配指定范围内的任意的单个字符
扩展:有时候写要匹配0到9之间的数字,可以这样写[0123456789],然而这样写太麻烦了,我们习惯上使用[0-9],同理a到g之间的字母[a-g],a到z之间的字母[a-z]。
[^]: 匹配指定范围外的任意的单个字符
2.用于匹配次数的元字符
*: 匹配其前面的字符任意次(包括0次)
扩展: .*: 任意长度的任意字符
?: 匹配其前面的字符1次或0次
{n} :匹配其前面的字符n次
{m,n}:匹配其前面的字符至少m次,至多n次
扩展:{m,} :匹配其前面的字符至少m次
3.用于位置锚定的元字符:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行
\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
分组:
()