[Linux Shell学习系列九]正则表达式-1什么是正则表达式

D17

1. 定义

正则表达式是一个描述一组字符的模式。与算术表达式类似,正则表达式也是由各种操作符结合小的表达式组成,这些所谓的操作符,即是正则表达式中的特殊元字符。

或者说,正则表达式是普通字符和元字符(元字符的引用:在前面加\)组成的字符集,而这个字符集匹配(或指定)一个模式。其基本单元是匹配单个字符的正则表达式。

正则表达式的主要作用是文本搜索和字符串处理。

 

2. 正则表达式类型

1)基本正则表达式:具有以下元字符

元字符 说明 示例
星号* 匹配它前面的字符串或正则表达式任意次(包括0次)

1122*,匹配11加上任意个2,如112、1122、11等

句号. 匹配除换行符外的任意一个字符

112.,匹配112加上任意一个非换行符的字符,如1121、112a,但不能匹配112

插入符号^ 匹配一行的开始,但有时依赖于上下文环境,可能表示否定正则表达式中一个字符串的意思 ^abc,匹配行首的abc字符串
美元符$ 匹配一行的末尾,放在正则表达式的末尾

123$,匹配行末的123字符串

^$,匹配一个空行

方括号[] 匹配方括号内指定的字符集中的一个字符

[abc]匹配字符a或b或c

[a-h]匹配a~h的任意一个字符

[a-z][A-Z]匹配任意一个大写或小写字母

[^a-d]匹配除a~d以外的所有字符

反斜线符号\ 转义一个特殊字符,使字符使用字面意思,而非元字符的作用 \\匹配\
转义尖括号\<\> 用于标记单词边界,尖括号必须是转义的,否则它们只有字面意思 \<the\>匹配字符串the,但不匹配then、there、other等

 

2)扩展正则表达式:在基本正则表达式的基础上扩展了一些元字符,如下

元字符 说明 示例
问号? 匹配0个或1个前面的字符,通常用于匹配单个字符 ab?c匹配abc或ac
加号+ 匹配1个或多个前面的字符,与*类似但不匹配0个字符的情况 ab+c匹配abc、abbc等,但不匹配ac
转义波形括号\{\} 指示匹配前面正则表达式的次数,波形括号必须是转义的,否则只表示字面意思 [0-9]\{5\}匹配5位数字
圆括号() 包含一组正则表达式,与下面的|操作符共同使用,或在expr提取子字符串时使用  
竖线| 正则表达式的或操作符,匹配一组可选的字符 a(b|c)d匹配abd或acd

 

3. POSIX字符类

是一个指定字符范围的替代方法。通常需用引号''或双方括号[[]]括起来

POSIX字符 含义
[:alnum:] 匹配字母和数字字符,等同于a~z,A~Z,0~9
[:alpha:] 匹配字母字符,等同于a~z,A~Z
[:blank:] 匹配空格或制表符
[:cntrl:] 匹配控制字符
[:digit:] 匹配十进制数字,等同于0~9
[:graph:] 匹配ASCII码值范围在33~126的字符。与下面的[:print:]相似,但不包含空格字符
[:lower:] 匹配小写字母,等同于a~z
[:upper:] 匹配大写字母,等同于A~Z
[:print:] 匹配ASCII码值范围在32~126的字符。与下面的[:graph:]相似,多了空格字符
[:space:] 匹配空白字符(空格和水平制表符)
[:xdigit:] 匹配十六进制数字,等同于0~9,A~F,a~f

 

4. Bash正则表达式比较操作符

从Bash3.0开始,Bash有了内部的正则表达式比较操作符,使用"=~"表示。可处理大部分grep和sed命令的编写脚本方法。

与其他比较操作符相同,如果一个表达式左边的变量匹配右边的正则表达式,将返回状态码0,否则返回1。

#判断是否是一个十进制数字
$ digit=1 $ [[ $digit =~ [0-9] ]] && echo "Yes" || echo "No" Yes $ digit=a $ [[ $digit =~ [0-9] ]] && echo "Yes" || echo "No" No

Bash的正则表达式可以是十分复杂的:

#判断邮箱格式
$ email=a@b.com
$ [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$ ]] && echo "Yes" || echo "No"
Yes
$ email=a@b
$ [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$ ]] && echo "Yes" || echo "No"
No

 

posted @ 2020-05-27 10:41  workingdiary  阅读(341)  评论(0)    收藏  举报