123
分类: LINUX
2012-10-25 16:57:34
转自:http://blog.csdn.net/yaozhiyi/article/details/6104487
1 . regular expressions 分类
--BRE(Basic Regular Expressions 基础正则表达式)
--ERE(Extended Regular Expressions 扩展正则表达式)
2 . BRE支持的元符号
1) . 匹配且仅匹配任意一个字符; .*表示长度为0或以上的任意字符串
2) * 与*之前的字符合作,表示该字符重复0次或者0次以上
3) ^ 用于锚定字符串的开始 , '^head' 表示匹配以head开头的行
4) $ 用于锚定字符串的结束 , 'tail$' 表示匹配以tail结尾的行
5) / 转义字符,消除字符的特殊含义 , '/''表示匹配单引号'
6) [] 匹配其中出现的字符 , '[adf]'表示必须匹配a或d或f中的一个,'[a-zA-Z1-9]'表示匹配所有字母和数字中的一个
7) [^] 匹配不在其中出现的字符 , [^1-9] 表示必须匹配不属于1-9的字符中的一个
8) /{/}放在字符后表示该字符重复的次数 , a/{3/}表示匹配3个a, a/{3,/}表示匹配至少3个a, a/{3,6/}表示匹配3-6个a
9) /(/)标记匹配的字符,grep '/(ab.c/)de/(bb*/)middle/1/2' 其中用/将1转义,即/1表示匹配与正则式ab.c已经匹配的串,/2则表示匹配与bb*已经匹配的串
10) />锚定单词的开始与结束 , grep '/
3 . ERE支持的元符号
1) ? 与?之前的字符合作,表示该字符或者出现或者不出现
2) | 用于匹配正则表达式集合中的一个,类似于或
3) + 与+之前的字符配合,表示该字符连续出现至少一次
4) {} 与BRE中的/{/}功能相同; 即a{3}匹配3个a,a{3,}匹配至少3个a , a{3,6}匹配3-6个a
5) () 指明某正则式作为一个整体,可以与|配合
4 . BRE 与 ERE 的异同
1) . * ^ $ / [] [^] 具有相同的功能
2) ERE 不支持/(/) 以及 /{/}
3) ERE 比 BRE 多支持 + ? | () 以及 {}
4) ERE 的{} 与 /{/} 具有相同的功能
5 . 方括号表达式
1) 方括号表达式(bracket expression)是由[ 和 ] 括起来的字符列表,他能匹配字符列表中的任一个字符
2) 如果字符列表以 ^ 开头, 则它能够匹配不在字符列表中的字符
6 . 方括号表达式中的元字符
1) 在方括号表达式中大多数元字符丧失了他们的特殊含义 , 包括元字符/ . * $ ( ) + < >
2) 如果想在方括号表达式中匹配一个字面意义的] , 那么应该把] 加到方括号表达式中的第一位
3) 如果想在方括号表达式中匹配一个字面意义的^ ,那么绝不该把 ^ 加到方括号表达式中的第一位
4) 如果想在方括号表达式中匹配一个字面意义的- , 那么应该把- 加到方括号表达式中的最后一位
5) 以上出自man grep 并有我自己的补充 Most meta-characters lose their special meaning
inside bracket expressions. To include a literal ] place it first in
the list. Similarly , to include a literal ^ place it anywhere but
first. Finally, to include a literal - place it last.
7 . 方括号表达式中的引号('和")
举grep 为例
1) grep ['] file 非法
2) grep ["] file 非法
3) grep "[']" file 合法
4) grep '["]' file 合法
5) grep "["]" file 非法
6) grep '[']' file 非法
8 . 方括号表达式(bracket expression) 中预定义(predefined)的字符类(class of characters)
1) [:alnum:] 即[a-zA-Z1-9] (alphabet and number)
2) [:alpha:] 即[a-zA-Z] (alphabet)
3) [:cntrl:] (control)
4) [:lower:] 即[a-z] (lower case)
5) [:upper:] 即[A-Z] (upper case)
6) [:ascii:]
7) [:digit:]
8) [:blank:] 空格或者tab
9) [:print:] 可打印字符
10)[:punct:] 标点符号
11)[:space:] 空格或tab或者垂直tab
12) [:xdigit:] 十六进制数字
9 . 方括号表达式实例验证
1) 准备文件file , 内容如下:
[aa]
{bb}
'cc'
"dd"
/ee/
(ff)
^gg^
$hh$
*ii*
.jj.
?kk?
|ll|
+mm+
-nn-
!vv!
`ww`
2) 验证]需要放在方括号表达式字符列表的最前
owner@YZY:~/notes$ grep '[!]]' file
owner@YZY:~/notes$ grep '[]!]' file
[aa]
!vv!
owner@YZY:~/notes$
3) 验证 ^ 绝不能放在方括号表达式字符列表的最后一位
owner@YZY:~/notes$ grep '[^]' file ===> 失败
grep: Unmatched [ or [^
owner@YZY:~/notes$ grep '[^!]' file ===> 匹配所有不等于!的字符
[aa]
{bb}
'cc'
"dd"
/ee/
(ff)
^gg^
$hh$
*ii*
.jj.
?kk?
|ll|
+mm+
-nn-
!vv!
`ww`
owner@YZY:~/notes$ grep '[!^]' file ===> ^ 放在最后,匹配字符 ! 或者 ^
^gg^
!vv!
owner@YZY:~/notes$ grep '[!^$]' file ===> 试试把 ^ 放在中间
^gg^
$hh$
!vv!
owner@YZY:~/notes$
4) 验证 - 必须放在方括号表达式的最后方
owner@YZY:~/notes$ grep '[-]' file
-nn- ==>匹配了两个 -
owner@YZY:~/notes$ grep '[a-]' file
[aa] ==> 匹配了两个 a
-nn- ==> 匹配了两个 -
owner@YZY:~/notes$ grep '[-a]' file ==>好像没错阿!那么,-不要放在两个字符中间就好了!
[aa] ==> 匹配了两个 a
-nn- ==> 匹配了两个 -
owner@YZY:~/notes$ grep '[ac-]' file
[aa] ==> 匹配了两个 a
'cc' ==> 匹配了两个 c
-nn- ==> 匹配了两个 -
owner@YZY:~/notes$ grep '[a-c]' file
[aa] ==> 匹配了两个 a
{bb} ==> 匹配了两个 b
'cc' ==> 匹配了两个 c
owner@YZY:~/notes$ grep '[c-a]' file ===> c-a 是一个无效的范围,匹配不了
owner@YZY:~/notes$
5) 验证{}[]()+.*/|?$在[]失效(前提:保证对- ^ ] 的位置做出正确的安排 ,并且其中的引号要特殊处理)
--^-] 位置的安排参考 6 的论述
--引号的处理参考 7 的论述
10. 方括号表达式预定义字符类验证
1) 准备字符文件 char_class ,每个字符一行,倒数2为空格,倒1为tab键:
owner@YZY:~/notes$ cat -A char_class
c$
C$
5$
`$
~$
!$
@$
#$
$$
%$
^$
&$
*$
($
)$
-$
=$
+$
[$
]$
{$
}$
/$
|$
:$
;$
'$
"$
<$
>$
?$
/$
,$
.$
$
^I$
owner@YZY:~/notes$
2)[:alnum:] [:digit:] [:xdigit:] [:alpha:] [:lower:] [:upper:]
owner@YZY:~/notes$ cat char_class | grep '[[:alnum:]]'
c
C
5
owner@YZY:~/notes$ cat char_class | grep '[[:digit:]]'
5
owner@YZY:~/notes$ cat char_class | grep '[[:xdigit:]]'
c
C
5
owner@YZY:~/notes$ cat char_class | grep '[[:alpha:]]'
c
C
owner@YZY:~/notes$ cat char_class | grep '[[:lower:]]'
c
owner@YZY:~/notes$ cat char_class | grep '[[:upper:]]'
C
owner@YZY:~/notes$
3)[:graph:]
owner@YZY:~/notes$ cat char_class | grep '[^[:graph:]]'
owner@YZY:~/notes$
//输出一个是空格一个是tab键,等练好了awk,我给显示出来.
4)[:cntrl:]
这一部分没想法
5)[:print:]
wner@YZY:~/notes$ cat char_class | grep '[^[:print:]]'
owner@YZY:~/notes$
//tab不能输出
6) [:punct:]
owner@YZY:~/notes$ cat char_class | grep '[[:punct:]]'
`
~
!
@
#
$
%
^
&
*
(
)
-
=
+
[
]
{
}
/
|
:
;
'
"
<
>
?
/
,
.
owner@YZY:~/notes$
7) [:blank:]
owner@YZY:~/notes$ cat char_class | grep '[[:blank:]]'
owner@YZY:~/notes$
//空格和tab
8) [:ascii:]
非法的名字
owner@YZY:~/notes$ cat char_class | grep '[[:ascii:]]'
grep: Invalid character class name
owner@YZY:~/notes$