正则表达式(regular expression),可简写为regex或re,是一种指定字符串模式的简洁方式。常用于字符串的搜索与替换操作。
例如,下面的一组字符串,作为正则表达式,可以使用xiao[123]表示:
xiao1 xiao2 xiao3
很多UNIX工具都使用正则表达式来强化其自身的功能,例如:
(1)查找匹配文本的grep家族(grep/egrep/agrep)
(2)大名鼎鼎的流编辑器sed
(3)字符串程序处理语言awk、perl等
(4)文本查看程序,例如more、less等
(5)文本编辑器,例如vi、emacs、jed等
正则表达式的强大来自拥有特殊含义的元字符(metacharacter)和缩写的使用。
. 除新行(如换行)字符外,匹配任意的单个字符
^ 锚:匹配行的开头
$ 锚:匹配行的末尾
\< 锚:匹配单词的开头
\> 锚:匹配单词的末尾
[list] 字符类:匹配list列表中的任一字符
[^list] 字符类:匹配不在list列表中的任何字符
( ) 分组:视为一个单独的单元
| 交替:匹配选择之一,为ERE运算符里优先级最低
\ 引用:从字面上解释元字符,通常用以关闭后续字符的特殊含义。
* 匹配在它之前的任何数目(或没有)的单个字符
注1:锚(anchor), 用来匹配在字符串的开头或末尾的位置。
注2:分组,由于()--圆括号提供分组功能,让运算符可以被应用到“前置的正则表达式”,如(xiao)+表示匹配于一个或连续重复的多个xiao
分组可以一民交替结合构建复杂且灵活的正则表达式。如[Aa]pple (computer|tv) is 表示在Apple(或apple)与is之间,包含有computer或tv的句子。
注3:
* 匹配0次或多次
+ 匹配1次或多次
? 匹配0次或1次
{n} 匹配n次
{n,} 最少匹配n次
{0,m} 最多匹配m次
{,m} 最多匹配m次
{n,m} 区间表达式,最少匹配n次,最多匹配m次
举例:
A \ { 2 \ }B_____A至少出现2次,AAB
A \ { 4,\ }B_____ A最少出现4次,如AAAAB,AAAAAB…
A \ { 2,4\ }B_____A出现次数范围2-4次,如AAB,AAAB,AAAAB
备注:
(1)?和 + 适用于扩展正则表达式。
我们可以把?想成是“可选用的”,也就是匹配前置正则表达式的文本,要么出现,要么没出现。举例看,与bc?e匹配的有be与bce,就这两个!
+字符在概念上 与*元字符类似,不过匹配前置正则表达式要匹配的文本在这里至少得出现一次,举例看,ab+c匹配于abc、abbc、abbbc,但不会匹配于ac。
(2)正则表达式中的“*”与Shell中的“*”是不同的 。
Shell中的“*”表示任意个字符,正则表达式中的“*” 匹配0次或多次某个字符。
举例:1)aa*,在正则表达式中,第一个a后面跟上0个或多个a
2)搜索k开头和结尾,中间是至少一个i的字符串,即kik, kiik、kiiik...等
grep 'kii*k' test.txt
[:lower:] 小写字母(类似于:a-z)
[:upper:] 大写字母(类似于:A-Z)
[:alpha:] 大小写字母(类似于:A-Za-z)
[:alnum:] 大小写字母、数字(A-Za-z0-9)
[:digit:] 数字(类似于:0-9)
[:punct:] 标点符号
[:blank:] 空格或制表符(空白符)
[:cntrl:] 控制字符
[:graph:] 非空格字符
[:space:] 空白字符
注:方括号是名称的一部分
例:grep ‘21[[:alpha:]]’ data
查找文件data中包含数字21后面跟一个小写字母或大写字母的所有行
grep ‘[[:upper:]][[:upper:]][[:digit:][[:lower:]]’ data
查找包含两个连续大写字母,后面跟一个数字,再跟一个小写字母的所有行
grep ‘X[0-9][0-9]’ data = grep ‘X[[:digit:]][[:digit:]]’ data
匹配不在特定字符类之中的字符,为此,只需在开头的左方括号之后放一个^,可以使用^(充当一个操作否定符)
grep ‘Y[^ak]’ data
查找包含字母Y,同时后面不跟有a或k的所有行
提示:每个字符类——不管他看上去有多么复杂(只表示一个单独的字符)
请关注 大有可为的“正则表达式”(二)