[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
欢迎大家评论交流,发现博文中存在的问题一定要留言哦

浙公网安备 33010602011771号