1.正则表达式的定义:
正则表达式通常用于判断语句中,使用字符串描述、匹配一系列符合某个规则的字符串。
正则表达式是由普通字符与元字符组成。
- 普通字符包括小写字母、数字、标点符号及一些其他符号。
- 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
(正则表达式模式都区分大小写)
2.正则表达式的分类:
正则表达式根据从POSIX BRE或者POSIX ERE标准可以分为:
- 基本正则表达式
- 扩展正则表达式
可以使用:
man 7 regex
(可以使用 man手册帮助)
3.文本三剑客(grep sed awk)支持的正则表达式:
shell是不支持正则表达式的(shell支持的是通配符)。shell中的正则表达式只有个别命令支持的,一般常用的是文本三剑客。
支持正则的shell命令 | 正则类型 |
grep | 默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符) |
sed | 默认使用基本正则表达式(BRE) |
awk | 使用扩展正则表达式(ERE) |
egrep 或 grep -E | 使用扩展的正则表达式(ERE) |
4.基本正则表达式:
支持的工具:grep、egrep、sed、 awk。(注意grep要配合-E或者-P使用)
元字符 | 含义及用法 |
\ | 表示转义字符,去掉特殊符号的特殊含义 |
. | 匹配任意单个字符 |
^ | 匹配字符串开头的位置 |
$ | 匹配字符串末尾的位置 |
* | 匹配前面的字符出现0~+∞ |
[list] | 匹配list列表中的一个字符(列表中只要有一个符合即可) |
[^list] | 匹配任意非list列表中的一个字符 |
{n} | 匹配前面的子表达式n次 |
{n,} | 匹配前面的子表达式最少n次 |
{,n} | 匹配前面的子表达式最多n次 |
{n,m} | 匹配前面的子表达式n到m次 |
[ ] | 代表单个字符 |
\? | 1次或0次 |
^$ | 空行 |
.* | 1~+∞ |
4.1转义字符的运用:
将特殊含义的字符转换为普通字符的含义:
被转义的特殊字符 | 转义前的含义作用 |
\ = | 具有赋值的作用,或则进行字符判断 |
\ ! | 取反 |
\ & | 单个&符可以将命令挂在后台上,两个是逻辑符号且的作用 |
\ $ | 取值变量的作用 |
将普通字符转换为特殊作用的字符:
被赋予新含义的普通字符 | 现在拥有的作用 |
\n | 换行 |
\t | 转化为制表符 |
\w(小写) | 匹配包括下划线的任何单词字符 |
\W(大写) | 匹配任何非单词字符。等通于"[^A-Za-z0-9_]" |
\r | 转换后是回车符 |
\d | 匹配一个数字字符 |
\D | 匹配一个非数字字符。等价于[^0-9] |
\s(小写) | 空白符 |
\S(大写) | 非空白符 |
4.2.中括号表达式:
普通中括号包围的字符组,表示某个单个字符匹配中括号内的任意字符即匹配成功
- x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
- 取反表示法: 中括号内开头使用 ^ ,表示只要不是中括号内的字符就匹配
x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串
特殊元字符在中括号中匹配:
- 想要在中括号中匹配: ^ ,需要将其放在 中括号非开头的位置 ,如:[a^]
- 想要在中括号中匹配: - ,需要将其放在 开头位置或结尾位置 ,如:[abc-]、[-abc]
- 想要在中括号中匹配: ] ,需要将其放在 开头位置 ,如:[]abc]
位置匹配:
^ : 匹配行首
$ : 匹配行尾
\b 匹配单词边界处的位置(开头和结尾) \bword\b 等价于 \<word\>
\< 匹配单词开头处的位置
\> 匹配单词结尾处的位置
\B 匹配非单词边界处的位置
字符类:
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字母 A-Z a-z |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:blank:] | 空白字符 |
[:space:] | 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广 |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃...) |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
量词:
\{m\} : 表示匹配前一个字符或前一个子表达式m次
\{m,n\} : (m<n)表示匹配前一个字符或前一个字表达式最少m次,最多n次
\{m,\} : 表示匹配前一个字符或前一个子表达式至少m次
\{,n\} : 表示匹配前一个字符或前一个字表达式最多n次(匹配0次也算是成功)
* 表示前一个字符或前一个子表达式匹配0次或多次,等价于:{0,}
.* 匹配任意长度的任意字符
5.扩展正则表达式的元字符:
egrep 默认使用的 是扩张正则
支持的工具:egrep
、awk
,注意:使用grep
要配合-E
或者-P
使用,sed
要配合-r
使用。
元字符 | 含义及用法 |
+ | 匹配前面子表达式1次以上,例: go+d,将匹配至少一个o,如god、good、goood等 |
? | 匹配前面子表达式0次或者1次,例: go?d,将匹配gd或god |
() | 将括号中的字符串作为一个整体,例1: g(oo)+d,将匹配oo整体1次以上,如good、gooood等 |
| | 以或的方式匹配字符串,例:g(oo|la)d,将匹配good或者 glad |
* | 匹配前面字符任意次 |
{n} | 匹配n次 |
{m,n} | 至少m,至多n次 |
扩展常用的量词:
- + 表示匹配前一个字符或前一个子表达式1或多次,即至少一次 等价于 {1, }
- ? 表示匹配前一个字符或前一个子表达式0或1次,等价于 {0,1} 等价于 {,1}
分组捕获和反向引用:
使用小括号()包围一部分正则表达式,这部分正则表达式即成为一个分组整体,也称为一个子表达式。
分组后可以使用 \N 来反向引用对应的分组匹配结果,N是1-9的正整数,\1表示第一个分组表达式的匹配结果,\2表达第二个分组表达式的匹配结果。
注意:反向引用引用的是分组匹配后的结果,不是分组表达式
例如:正则表达式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”