正则表达式

正则表达式

  • 一、正则表达式的元字符
  • 二、表示次数
  • 三、位置锚定
  • 四、分组
  • 五、扩展正则表达式

一、正则表达式的元字符

元字符 含义
. 匹配任意单个字符,可以是一个汉字
\. " \ "为转义符,“ \ .”只表示“.”
() 表示分组
\(\) 使用转义符,只表示\ ( \ )
[] 匹配指定范围内的任意单个字符,示例: [0-9] [] [a-zA-Z] [:alpha:]
[^] 匹配指定范围外的任意单个字符(取反)
[:alnum:] 字母和数字 [0-9] [a-z] [0-9] [a-z]
[:alpha:] 代表任何英文大小写字符,亦即 [A-Z], [a-z]
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母 [A-Z]
[[:blank:]] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w 匹配单词构成部分,等价于[_[:alnum:]]
\W 匹配非单词构成部分,等价于[^_[:alnum:]]
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]

[root@localhost ~]#ls /etc/ | grep rc[.0-6]  
grep命令使用正则表达式rc[.0-6]来匹配文件名中包含rc加数字(0-6)的文件或目录名,
其中方括号[]表示字符集,[.0-6]表示匹配.和0-6这些字符中的任意一个。
#此处的点代表字符
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local

[root@localhost ~]# ls /etc/ | grep 'rc\.' #只匹配已rc.开头的文件
#\为转义符,此处的.只表示.,不表示任意字符
rc.d
rc.local

[root@localhost ~]# ls /opt | grep "t."  #过滤出仅包含字母"t"后跟任何其他字符的行。

[root@localhost ~]# grep 'r..t' /etc/passwd         
#r..t ..代表任意两个字符    
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@localhost ~]# echo abc |grep a.c              
#表示原来的点需要加\转义
abc
[root@localhost ~]# echo abc |grep a\.c
#使用grep正则表达式时不加引号有时匹配会有出入
abc
[root@localhost ~]# echo abc |grep 'a\.c'          
#标准格式需要加'' 或者""

[root@localhost ~]# ls |grep '[fhtx].txt'    
#匹配[]中任意一个字符
f.txt
h.txt
t.txt
x.txt
[root@localhost ~]# ls [a-d].txt                
#通配符
a.txt  A.txt  b.txt  B.txt  c.txt  C.txt  d.txt
[root@localhost ~]# ls | grep '[a-d].txt'             
#真正的小写在正则表达式中
a.txt
b.txt
c.txt
d.txt
[root@localhost ~]# ls |grep '[^a-z].txt'   
#显示非小写字母
A.txt
B.txt

[root@localhost ~]# ls |grep '[^a.z].txt'     
#“[^a.z]”表示不匹配字母“a”或“z”的任何字符(取反)

space空格
[root@localhost ~]# grep [[:space:]] 123.txt 
hhh  
jj		l
kkk 
 
[a-zA-Z] #表示同时匹配大小写

二、表示次数

字符 含义
* 匹配前面字符任意次
.* 匹配任意长度的任意字符,不包括0次
\? 匹配前面出现的字符出现0次或1次
\+ 匹配前面出现的字符出现最少1次,>=1
\{n\} 匹配前面字符n次,=n
\{m,n\} 匹配前面字符至少m次,至多n次,m<= <=n
\{,n\} 匹配前面字符至多n次,<=n
\{n,\} 匹配前面字符至少n次,>=n

2.1 *: 匹配前面的字符任意次,包括0次

[root@localhost ~]# echo  ac |grep 'ab*c'  #ab之间不输入b可匹配
ac
[root@localhost ~]# echo  abc |grep 'ab*c' #ab之间输入1个b可匹配
abc
[root@localhost ~]# echo  abbc |grep 'ab*c'#ab之间输入2个b可匹配
abbc

2.2 .* : 任意长度的任意字符,不包括0次,也就是匹配所有

[root@localhost ~]# echo ac |grep 'ab.*c'  #ac之间不输入b匹配不到
[root@localhost ~]# echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配
abc
[root@localhost ~]# echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配
abbc

2.3 ?: 匹配其前面的字符出现0次或1次,即:可有可无

[root@localhost ~]# echo ac | grep 'ab\?c'    #ac之间不输入b可以匹配
ac
[root@localhost ~]# echo abc | grep 'ab\?c'   #ac之间输入1个b可以匹配
abc
[root@localhost ~]# echo abbc | grep 'ab\?c'  #ac之间输入2个b匹配不到 

2.4 \+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次

[root@localhost ~]# echo ac | grep 'ab\+c'  #ac之间不输入b匹配不到
[root@localhost ~]# echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配
abc
[root@localhost ~]# echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配
abbbbc

2.5 \{n} #匹配前面的字符=n次

[root@localhost ~]# echo abbbc |grep 'ab\{3\}c'  #输出abbbc匹配ac之间b字符出现3次可以匹配
abbbc
[root@localhost ~]# echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到

2.6 \{m,n\} #匹配前面的字符至少m次,至多n次

[root@localhost ~]# echo abc |grep 'ab\{1,3\}c'  #输出abc匹配ac之间b出现最少1次最多3次可以匹配
abc
[root@localhost ~]# echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配
abbc
[root@localhost ~]# echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配
abbbc
[root@localhost ~]# echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到

2.7 \{,n\} #匹配前面的字符至多n次,<=n

2.8 \{n,\} #匹配前面的字符至少n次

三、位置锚定

符号 含义
^ 以什么为开头,用于开头
$ 以什么为结尾,用于结尾
^$ 取空白行
^[[:space:]]$ 取空白行
^字符串$ 每一行只有一个字符串时才能匹配到
\<或\b 词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\>或\b 词尾锚定,用于单词模式的右侧
[root@localhost ~]# cat a.txt                #查看a.txt内容 
root
abc   abd  abf abe 
asfase
asdfasfewe
[root@localhost ~]# cat a.txt |grep '^a'     #查看a.txt内容过滤以a开头的行
abc   abd  abf abe 
asfase
asdfasfewe
[root@localhost ~]# cat a.txt |grep 'e$'     #查看a.txt内容过滤以e为结尾的行
asfase
asdfasfewe
[root@localhost ~]# cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行
root
[root@localhost ~]# cat a.txt |grep '\ba'    #查看a.txt过滤以a开头的词
abc   abd  abf abe 
asfase
asdfasfewe
[root@localhost ~]# cat a.txt |grep 'e\b'    #查看a.txt过滤以e为结尾的词
abc   abd  abf abe 
asfase
asdfasfewe
[root@localhost ~]# cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc
abc 

四、分组

()将多个字符捆绑在一起当做一个整体处理

[root@localhost ~]# echo abcccc |grep "abc\{4\}"  #匹配输出内容c出现4次
abcccc
[root@localhost ~]# echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到
[root@localhost ~]# echo abcabcabcabc |grep "\(abc\)\{4\}"  #abc字符加()分组匹配输出内容abc出现4次匹配成功
abcabcabcabc

五、扩展正则表达式

grep -E		或	sed -r		或	egrep
字符 含义
* 匹配前面字符任意次
.* 匹配任意长度的任意字符,不包括0次
匹配前面出现的字符出现0次或1次
+ 匹配前面出现的字符出现最少1次,>=1
{n} 匹配前面字符n次,=n
{m,n} 匹配前面字符至少m次,至多n次,m<= <=n
{,n} 匹配前面字符至多n次,<=n
{n,} 匹配前面字符至少n次,>=n
将test.txt中的内容用扩展正则表达式输出
[root@localhost ~]# cat test.txt
987-123-4567
987 456-1230
(123) 456-7890
[root@localhost ~]# cat test.txt | grep -E "(\([0-9]+\)|[0-9]+)[ -]?[0-9]+[ -]?[0-9]+"

你可能感兴趣的:(正则表达式)