前言:通过前两篇的学习,我们已经掌握了如何利用正则表达式去"匹配位置"或者"匹配连续次数",在这一篇中,我们来总结一下正则中其他的一些常用符号。
1..
和*
首先来介绍两个好兄弟,.
在正则中表示匹配一个任意字符,这个任意字符可以是字母、数字、以及其他符号。而*
在正则中表示匹配任意个数的任意字符,也就是说不管有多少任意字符,都会全部匹配到,大家最熟悉的可能就是*
在Linux中作为通配符出现。
. 表示匹配一个任意字符
* 表示匹配任意个数的任意字符
换言之,你在正则中输入N多个...
,效果等同于一个*
。
示例:
比如我现在有一个test.txt,内容如下:
a12
a123
a 456
aabbb
b123
b 456
匹配以字母a开头的连续三个任意字符:

匹配以字母a开头的连续四个任意字符:

2.匹配任意字母
通过上面.
的使用,我们知道可以匹配任意字符,但是如果我想继续缩小匹配范围呢?比如,我只想匹配test.txt文件中以a开头同时后面三个字符全部为字母的情况?
匹配以字母a开头的连续三个任意字母:

可以看到,命令里的
\{3\}
就表示连续匹配三次,而前面的[[:alpha:]]
在正则就表示匹配一个任意字母。只要字母a后面三个连续字符中有一个不是字母(是数字、空格、或者其他字符时),就不会被匹配到。
3.匹配任意数字
现在,聪明的你肯定可以举一反三了。如果是想匹配任意一个数字,只需要在正则中加入[[:digit:]]
就可以实现了。
比如匹配字母a已经后面的连续两个数字,或者三个数字:

此外:
[[:lower:]]
等价于[a-z]
,可以匹配任意的小写字母;
[[:upper:]]
等价于[A-Z]
,可以匹配任意的大写字母;
[[:alpha:]]
还等价于[a-zA-Z]
,可以匹配任意字母,不区分大小写;
[[:digit:]]
等价于[0-9]
,可以匹配0到9的任意一个数字;
4. []
的含义
既然我们知道了如何限定字母或者数字的匹配,那么你有没有思考过[]
在正则中的作用呢?
其实不难理解,[]
,也就是方括号,其实是用来告诉我们的计算机程序(比如grep),我要匹配什么样的内容。
所以比如一串字符“abcdefg”,我只想匹配中间的“cde”,那么就可以使用[cde]
来匹配。
所以:
[a-z]
,其实表示的就是[abcdefghijklmnopqrstuvwxyz]
;
[A-Z]
,其实表示的就是[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
;
[0-9]
,其实表示的就是[0123456789]
;
怎么样?这样学正则是不是感觉就很简单轻松了呢。很多教程都会一上来就让你去背长长的正则表,却不教你怎么去理解它,这样反而更耽误时间!
网友评论