跳到主要内容

正则表达式

正则表达式(Regular Expression、regex或regexp,缩写RE),用于查找过程中匹配指定的字符。

支持正则表达式的程序如:locate、find、vim、grep、sed、awk等

正则表达式分两类:

  • 基本正则表达式:BRE

  • 扩展正则表达式:ERE

正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组

BRE和ERE的区别

基本正则表达式和扩展正则表达式的区别就只在于部分元字符的用法

BRE元字符:^$.[]*

ERE元字符:^$.[]*(){}+?|

在BRE中,(){}+?|就表示它们本身,如果要使用它们的特殊作用,要加转义符\,如\(\);而在ERE中,如要表示这些元字符本身,也要加转义符\

例如,grep "[a-z]\+"相当于egrep或grep -E "[a-z]+"

正则表达式元字符

匹配符

匹配符说明
.匹配除回车以外的任意一个字符,如要匹配字符".",则要加转义符: \.
( )字符串分组,,将一个或多个字符捆绑在一起,当作一个整体处理
[ ]定义字符类,匹配括号中的任意一个字符。示例:[wang][0-9] [a-z][a-zA-Z]
[ ^ ]表示否定括号中出现字符类中的字符, 取反。写在字符最左边
\ 转义字符
|或 a|b #a或b C|cat #C或cat (C|c)at #Cat或cat

正则表达式POSIX字符

posix字符一次只匹配一个范围中的一个字节

# POSIX字符。写法:[[xxx]]
[:alnum:] 任意字母和数字 0-9 a-z A-Z
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母A-Z
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 0-9
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

分组()

将一个或多个字符捆绑在一起,当作一个整体处理

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

\(string1\(string2\)\)
\1 :string1\(string2\)
\2 :string2
# 禁止swap:给swap这一行加注释
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

匹配次数

用在要指定次数的字符或字符串后面,用于指定前面的字符或字符串要出现的次数

* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
? 匹配其前面的字符0或1次,即:可有可无
+ 匹配其前面的字符至少1次,即:肯定有
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次
{n,} 匹配前面的字符至少n次

位置锚定

位置锚定可以用于定位出现的位置

行模式:行首行尾字符

^ 行首锚定,^a 以a开头 默认锚定一个字符
$ 行尾锚定,a$ 以a结尾 默认锚定一个字符
^PATTERN$ 匹配整行
^$ 空行
^[[:space:]]*$ 空白行

单词模式:一行内任意单词的词首词尾

\< 或 \b 词首锚定,写在要匹配的字符左侧
\> 或 \b 词尾锚定,写在要匹配的字符右侧
\<PATTERN\> 匹配整个单词