大有可为的“正则表达式”(一)

5.1.  正则表达式概述

正则表达式(regular expression),可简写为regexre,是一种指定字符串模式的简洁方式。常用于字符串的搜索与替换操作。

例如,下面的一组字符串,作为正则表达式,可以使用xiao[123]表示:

xiao1   xiao2    xiao3

很多UNIX工具都使用正则表达式来强化其自身的功能,例如:

1)查找匹配文本的grep家族(grep/egrep/agrep

2)大名鼎鼎的流编辑器sed

3)字符串程序处理语言awkperl

4)文本查看程序,例如moreless

5)文本编辑器,例如viemacsjed

5.2.  正则表达式使用语法

正则表达式的强大来自拥有特殊含义的元字符(metacharacter)和缩写的使用。

5.2.1.  特殊含义的元字符

.          除新行(如换行)字符外,匹配任意的单个字符

^                锚:匹配行的开头

$                锚:匹配行的末尾

\<               锚:匹配单词的开头

\>               锚:匹配单词的末尾

[list]          字符类:匹配list列表中的任字符

[^list]        字符类:匹配不在list列表中的任何字符

       分组:视为一个单独的单元

|                 交替:匹配选择之一,为ERE运算符里优先级最低

\                 引用:从字面上解释元字符,通常用以关闭后续字符的特殊含义。

*           匹配在它之前的任何数目(或没有)的单个字符

1锚(anchor), 用来匹配在字符串的开头或末尾的位置。

2:分组,由于()--圆括号提供分组功能,让运算符可以被应用到“前置的正则表达式”,如(xiao+表示匹配于一个或连续重复的多个xiao

     分组可以一民交替结合构建复杂且灵活的正则表达式。如[Aa]pple computer|tv is 表示在Apple(或apple)与is之间,包含有computertv的句子。

3

5.2.2.  重复运算符

*                匹配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次,如AAAABAAAAAB

A \ { 24\ }B_____A出现次数范围2-4次,如AABAAABAAAAB

 

备注:

1)?和 + 适用于扩展正则表达式。

我们可以把?想成是“可选用的”,也就是匹配前置正则表达式的文本,要么出现,要么没出现。举例看,与bce匹配的有bebce,就这两个!

+字符在概念上 *元字符类似,不过匹配前置正则表达式要匹配的文本在这里至少得出现一次,举例看,ab+c匹配于abcabbcabbbc,但不会匹配于ac

2)正则表达式中的“*”与Shell中的“*”是不同的

Shell中的“*”表示任意个字符,正则表达式中的“* 匹配0次或多次某个字符。

举例:1aa*,在正则表达式中,第一个a后面跟上0个或多个a

      2)搜索k开头和结尾,中间是至少一个i的字符串,即kik, kiikkiiik...

grep  'kii*k' test.txt

 

5.2.3.  预定义字符类(方括号表达式)

[: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,同时后面不跟有ak的所有行

 

提示:每个字符类——不管他看上去有多么复杂(只表示一个单独的字符)

请关注 大有可为的“正则表达式”(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章