正则表达式完全指南
立即解锁
发布时间: 2025-08-14 01:38:26 阅读量: 8 订阅数: 12 


Linux命令行完全入门指南
### 正则表达式完全指南
#### 1. 正则表达式基础
正则表达式是用于匹配文本模式的强大工具。在正则表达式中,匹配可能仅在文件中的行满足特定条件时发生。例如,若要匹配包含至少四个字符,且字符 `b`、`z`、`i` 和 `p` 按顺序出现且中间无其他字符的行。字符串 `bzip` 中的字符都是字面字符,即它们匹配自身。
正则表达式除了字面字符外,还可以包含元字符,用于指定更复杂的匹配。常见的正则表达式元字符如下:
```plaintext
^ $ . [ ] { } - ? * + ( ) | \
```
除这些元字符外,其他字符都被视为字面字符。不过,反斜杠字符在某些情况下用于创建元序列,也可让元字符被当作字面字符处理,而非解释为元字符。
需要注意的是,许多正则表达式元字符在 shell 进行扩展时也有特殊含义。当在命令行传递包含元字符的正则表达式时,必须将其用引号括起来,以防止 shell 尝试对其进行扩展。
#### 2. 元字符的使用
##### 2.1 任意字符(`.`)
点号(`.`)是一个元字符,用于匹配任意字符。若在正则表达式中包含它,它将匹配该字符位置的任意字符。例如:
```bash
[me@linuxbox ~]$ grep -h '.zip' dirlist*.txt
bunzip2
bzip2
bzip2recover
gunzip
gzip
funzip
gpg-zip
preunzip
prezip
prezip-bin
unzip
unzipsfx
```
在这个例子中,我们搜索文件中匹配正则表达式 `.zip` 的行。可以注意到,`zip` 程序未被找到,因为点号元字符使所需匹配的长度增加到四个字符,而 `zip` 只有三个字符,所以不匹配。此外,如果文件列表中有包含文件扩展名 `.zip` 的文件,也会被匹配,因为文件扩展名中的点号也被视为“任意字符”。
##### 2.2 锚点(`^` 和 `$`)
脱字符(`^`)和美元符号(`$`)在正则表达式中被视为锚点。`^` 表示正则表达式必须出现在行的开头,`$` 表示必须出现在行的结尾。示例如下:
```bash
[me@linuxbox ~]$ grep -h '^zip' dirlist*.txt
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit
[me@linuxbox ~]$ grep -h 'zip$' dirlist*.txt
gunzip
gzip
funzip
gpg-zip
preunzip
prezip
unzip
zip
[me@linuxbox ~]$ grep -h '^zip$' dirlist*.txt
zip
```
这里我们分别搜索位于行开头、行结尾以及行中仅包含 `zip` 的情况。需要注意的是,正则表达式 `^$` 可以匹配空白行。
##### 2.3 填字游戏助手
利用正则表达式可以帮助解决填字游戏问题。Linux 系统的 `/usr/share/dict` 目录下通常有字典文件,这些文件是按字母顺序排列的单词列表。例如,要找到一个五个字母的单词,其第三个字母是 `j`,最后一个字母是 `r`,可以使用以下命令:
```bash
[me@linuxbox ~]$ grep -i '^..j.r$' /usr/share/dict/words
Major
major
```
这个正则表达式可以找出字典文件中所有符合条件的单词。
#### 3. 括号表达式和字符类
##### 3.1 括号表达式
除了匹配任意字符,还可以使用括号表达式从指定的字符集中匹配单个字符。例如,使用包含两个字符的集合,可以匹配包含字符串 `bzip` 或 `gzip` 的行:
```bash
[me@linuxbox ~]$ grep -h '[bg]zip' dirlist*.txt
bzip2
bzip2recover
gzip
```
集合可以包含任意数量的字符,元字符在括号内会失去其特殊含义。但有两种情况例外:脱字符(`^`)用于表示否定,连字符(`-`)用于表示字符范围。
##### 3.2 否定(`^`)
如果括号表达式的第一个字符是脱字符(`^`),则表示剩余的字符不能出现在该字符位置。例如:
```bash
[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
bunzip2
gunzip
funzip
gpg-zip
preunzip
prezip
prezip-bin
unzip
unzipsfx
```
这里的结果是包含字符串 `zip` 且前面不是 `b` 或 `g` 的文件列表。需要注意的是,`zip` 文件未被找到,因为否定字符集仍需要一个字符,只是该字符不能是被否定集合中的成员。脱字符只有在括号表达式的第一个位置时才表示否定,否则就是普通字符。
##### 3.3 传统字符范围(`-`)
可以使用连字符(`-`)来表示字符范围。例如,要找到文件名以大写字母开头的文件,可以使用以下正则表达式:
```bash
[me@linuxbox ~]$ grep -h '^[A-Z]' dirlist*.txt
MAKEDEV
ControlPanel
GET
HEAD
POST
X
X11
Xorg
MAKEFLOPPIES
NetworkManager
NetworkManagerDispatcher
```
通过使用三个字符的范围,我们可以缩写 26 个大写字母。任何字符范围都可以用这种方式表示,包括多个范围。如果要在括号表达式中包含连字符,可以将其放在表达式的第一个位置。
##### 3.4 POSIX 字符类
传统的字符范围虽然易于理解和使用,但在某些情况下可能会出现问题。为了解决这个问题,POSIX 标准引入了字符类。常见的 POSIX 字符类如下表所示:
| 字符类 | 描述 |
| ---- | ---- |
| `[:alnum:]` | 字母数字字符;在 ASCII 中,等同于 `[A-Za-z0-9]` |
| `[:word:]` | 与 `[:alnum:]` 相同,外加下划线字符 `_` |
| `[:alpha:]` | 字母字符;在 ASCII 中,等同于 `[A-Za-z]` |
| `[:blank:]` | 包含空格和制表符 |
| `[:cntrl:]` | ASCII 控制代码;包括 ASCII 字符 0 到 31 和 127 |
| `[:digit:]` | 数字 0 到 9 |
| `[:graph:]` | 可见字符;在 ASCII 中,包括字符 33 到 126 |
| `[:lower
0
0
复制全文
相关推荐









