regular expression,简写REGEXP
主要关注正则表达式里面的一些元字符,这些字符不表示本身的意义,而表示一些通配的意义(正则表达式默认工作在贪婪模式下,即尽可能长的匹配)
模式的概念:
字符和正则表达式的元字符组合起来过滤文本的过滤条件
正则表达式分两类:
basic regexp:基本正则表达式
extended regexp:扩展正则表达式
基本正则表达式:
(1)字符匹配
. 匹配任意单个字符
[] 匹配指定范围之内的任意单个字符
[^] 匹配指定范围之外的任意单个字符
也可以字符集合的方法来表示匹配字符集合里面的任意单个字符
[:digit:] 数字
[:alpha:] 所有字母
[:alnum:] 数字和字母
[:lower:] 小写字母
[:upper:] 大写字母
[:punct:] 标点符号
[:space:] 空白字符
注意:
使用字符集合的时候,还要使用一个方括号括起来,就是要用到两个方括号
(2)次数匹配:
* 匹配其前面的字符任意次
.* 匹配任意长度的任意字符(跟通配符中的*表示的一样)
\? 匹配其前面的字符0次或1次
\{m,n\} 匹配其前面的字符最少m次,最多n次(反斜线是用来转义的,因为在bash shell中,花括号会被理解成命令行展开)
\{m\} 匹配其前面的字符最少m次
举栗子:
a.*b 表示a开头,b结尾,中间是任意长度的任意字符
\{1,\} 最少1次
\{0,3\} 最多3次
(3)位置锚定
^ 锚定行首,此字符后面的任意内容必须出现在行首
$ 锚定行尾,此字符前面的任意内容必须出现在行尾
^$ 表示空白行
\<或者\b:锚定词首,其后面的任意字符必须作为单词的首部出现
>或者\b:锚定词尾,其前面的任意字符必须作为单词的尾部出现
举栗子:
\<root\> 匹配单词root(root既是词首,也是词尾)
(4)分组
\(..\)
\(ab\) ab作为一个整体,ab可以出现0次、1次或者多次
分组的主要目的是:后向引用,在后面引用前面括号括起来的内容
\1 引用第一个小括号分组中的内容
\2 引用第二个小括号分组中的内容
\3 引用第三个小括号分组中的内容
举栗子:
grep ‘\(l..e\).\1’ test.txt可以匹配到以下两行:
He love his lover.
He like his liker.
扩展正则表达式:
(1)字符匹配
. 匹配任意单个字符
[] 匹配指定范围之内的任意单个字符
[^] 匹配指定范围之外的任意单个字符
(2)次数匹配
* 匹配其前面的字符任意次
.* 匹配任意长度的任意字符(跟通配符中的*表示的一样)
?:匹配其前面的字符0次或1次
+:匹配其前面的字符至少1次,相当于{1,}
{m,n} 匹配其前面的字符最少m次,最多n次(在扩展正则表达式中,不需要加反斜线)
{m} 匹配其前面的字符最少m次
(3)位置锚定
^ 锚定行首,此字符后面的任意内容必须出现在行首
$ 锚定行尾,此字符前面的任意内容必须出现在行尾
\<或者\b:锚定词首,其后面的任意字符必须作为单词的首部出现
>或者\b:锚定词尾,其前面的任意字符必须作为单词的尾部出现
(4)分组
() #不需要加反斜线
\1 引用第一个小括号分组中的内容
\2 引用第二个小括号分组中的内容
\3…
(5)竖线
| 表示或者的意思
C|cat 匹配C或者cat
(C|c)at 匹配Cat或者cat
总结:
1、基本正则表达式和扩展正则表达式的区别:
(1)扩展正则表达式中,表示分组的括号和表示次数匹配的花括号和问号,前面都不需要加反斜线
(2)扩展正则表达式中,次数匹配多了一个”+”号,表示匹配一次或者多次
(3)扩展正则表达式中,多了一个竖线的符号,表示或者的意思
2、正则表达式和通配符的区别:
在文本过滤工具里面,都是用正则表达式,比如像awk、sed、grep等,都是针对文件内容的;而通配符是linux系统本身就支持的,多用在文件名上,比如像find、ls、cp,等等
通配符:
* 任意长度的任意字符
? 任意单个字符
[] 指定范围内
[^] 指定范围外