正则表达式
一.含义正则表达式是利用通配符来代表数据流中的一个或多个字符.
表现形式如下:
数据-->正则表达式-->匹配的数据
|
|
滤过的数据
二.用途和分类
Linux主要用于sed编辑器,awk程序和grep攻击
正则表达式是利用正则逼到大师引擎实现的.
主要分为两种:POSIX基本正则表达式(BRE)引擎
POSIX扩展正则表达式(ERE)引擎
三.定义的BRE模式
1.特殊字符.*[]^${}\+?|()
如果要用某个特殊字符作为文本字符,必须要转义,这个特殊的字符为反斜线(\)
eg:echo "3 / 2" | sed -n '/\//p'
3 / 2
2.锚字符
有两个特殊的字符可以用来将模式锁定在数据流的行首或行尾
1>锁定在行首
脱字符(^)定义从数据流中文本行首开始的模式
eg: $ echo "The book store" | sed -n '/^book/p'
$
2>锁定在行尾
($)特殊字符定义了行尾锚点,将这个特殊字符加载文本模式之后来指明数据行必须以该文本模式结尾
eg: echo "There are a lot of book" | sed -n '/book$/p'
There are a lot of book
3.点字符
点字符用来匹配任意的但字符,除了换行符
eg:sed -n './at/p' data
The cat is sleeping
4.字符组
字符组可以用来定义匹配文本模式中某个为止的一组字符,如果字符组中的某个字符出现在了数据流中,那它就匹配了该模式
eg: sed -n '/[ch]at/p' data
The cat is sleeping
That is a very nice hat.
5.排除字符
在字符组的开头加个脱字符:
eg:sed -n '/[^ch]at/p' data
This is at line two
通过排除字符组,正则表达式将会匹配c或h之外的任何字符,以及文本模式
6.使用区间
可以用单破折符号来在字符组中使用字符区间,可以指定区间的第一个字符,单破折线,最有一个字符
例子:sed -n '/^[0-9][0-9][0-9][0-9]$/p' data
打印出包含 5个0-9的数字的行
7.特殊字符组
BRE特殊字符
[[:alpha:]] 匹配任意字母字符,不管是大写还是小写
[[:alnum:]] 匹配任意字母数字字符0-9,A-Z或a-z
[[:blank:]] 匹配空格或制表符
[[:digit:]] 匹配0-9之间的数字
[[:lower:]] 匹配小写字母字符a-z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白符:空格,制表符,NL,FF,VT和CR
[[:upper:]] 匹配任意大写字母字符A-Z
eg: echo "abc" | sed -n '/[[:alpha:]]/p'
abc
8.星号
在字符后面防止星号说明该字符将会在匹配模式的文本中出现0次或多次
eg: echo "ieeek" | sed -n '/ie*k/p'
ieeek
三.扩展的正则表达式
1.问号
问号表明前面的字符可以出现0次或1次,但只限于此
eg: echo "bet" | awk '/be?t{print $0}'
bet
echo "bt" | awk '/be?t'{print $0}'
bt
2.加号
加号类似于星号的一个模式符号,跟问号也有不同.加号表明前面的字符可以出现1次或多次,但必须出现1次
eg:echo "beeet" | awk '/be+t{print $0}'
beeet
echo "bet" | awk '/be+t{print $0}'
3.花括号
ERE中花括号允许你可以为重复的正则表达式指定一个上限,这个通常叫做区间.
m--正则表达式准确出现m次
m,n--正则表达式至少出现m次,至多n次
eg:echo "bet" | awk '/be{1,2}t{print $0}'
bet
4.管道符号
管道符号允许你在检查数据流时,用逻辑OR方法指定正则表达式引擎要用的两个或多个模式.如果任何一个模式匹配了数据流文本,文本就通过了
格式:expr1|exper2
eg:echo "The cat is asleep" | awk '/cat|dog/{print $0}'
The cat is asleep
正则表达式和管道符号之间不能有空格
5.聚合表达式
正则表达式也可以用圆括号聚合起来,当你聚合正则表达式模式时,该组就会被方程标准字符.
eg:echo "Saturday" | awk '/Sat(urday){print $0}'
Saturday
四.实际应用
邮件地址解析
^([a-zA-Z0-9]_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$
解析:以'a'到'a'或'A'到'Z'或'0'到'9'开头后面跟_,.,+ 跟 @ 中间跟'a'到'a'或'A'到'Z'或'0'到'9',_,-,.,+ 跟 '.' 最后一部分为2到5位大小写字母