文章目录
- [Linux 正则表达式](#Linux 正则表达式)
Linux 正则表达式
正则表达式基础概念
定义与作用
正则表达式是一种用于匹配字符串的模式(pattern),通过将该模式与目标字符串对比,实现对一个或多个特定字符串的查找。它广泛应用于文本处理场景,如搜索、过滤、替换等。
组成结构
正则表达式由普通字符 和元字符组成,具体如下:
- 普通字符:未被指定为元字符的所有可打印与不可打印字符,涵盖所有大小写字母(a-z、A-Z)、数字(0-9)、标点符号(如逗号、句号)及其他符号。
- 元字符 :除普通字符外,具有特殊功能的字符,用于定义匹配规则(如
[ ]
、^
、$
等)。
应用范围
- 工具:vim(文本编辑器)、grep(文本搜索)、less(分页查看)等。
- 编程语言:Perl、Python、C 等。
正则表达式分类
类别 | 特点 | 适用场景 |
---|---|---|
普通正则表达式 | 支持基础元字符,功能较简洁 | 简单的文本匹配、搜索任务 |
扩展正则表达式 | 支持更多元字符(如+ 、? 、{} ),功能更丰富 |
复杂的匹配需求(如限定字符出现次数、多条件选择) |
环境准备
以word
文件为示例,初始内容通过以下命令创建和查看:
bash
[root@client ~ 09:26:37]# vim word
cat
category
acat
concatenate
dog
核心匹配规则与示例
直接使用普通字符作为匹配模式,查找包含该字符的字符串。
bash
[root@client ~ 09:26:57]# cat word | grep 'cat'
cat
category
acat
concatenate
字符集匹配
[..]
:匹配括号内任意一个字符
bash
[root@client ~ 09:27:32]# echo cbt >> word
[root@client ~ 09:27:50]# echo c{1..5}t >> word
[root@client ~ 09:28:00]# cat word | grep 'c[45]t'
c1t c2t c3t c4t c5t
[root@client ~ 09:28:21]# vim word
[root@client ~ 09:28:50]# cat word | grep 'c[45]t'
c4t
c5t
[root@client ~ 09:28:53]# cat word | grep 'c[ab]t'
cat
category
acat
concatenate
cbt
-
预设字符范围:
字符集 含义 等价写法 [a-z]
匹配所有小写字母 - [A-Z]
匹配所有大写字母 - [0-9]
匹配所有数字 - [a-zA-Z0-9]
匹配所有字母和数字 [[:alnum:]]
[a-z]
匹配所有小写字母 [[:lower:]]
[A-Z]
匹配所有大写字母 [[:upper:]]
[0-9]
匹配所有数字 [[:digit:]]
[[:xdigit:]]
匹配十六进制数字(0-9、A-F、a-f) - [[:alpha:]]
匹配所有字母(大小写) [a-zA-Z]
[[:blank:]]/[[:space:]]
匹配空白字符(制表符、换行符、空格等) - [[:punct:]]
匹配标点符号(如 $、&、()、* 等) - [[:print:]]/[[:graph:]]
匹配可打印字符(字母、数字、标点) - [[:cntrl:]]
匹配控制字符(ASCII 中 000-037、177) - -
特殊符号处理 :若需匹配
-
,需将其放在字符集第一个位置。
bash
[root@client ~ 09:29:01]# cat word | grep 'c[0-9]t'
c1t
c2t
c3t
c4t
c5t
[root@client ~ 09:29:13]# cat word | grep 'c[a-z]t'
cat
category
acat
concatenate
cbt
[root@client ~ 09:29:20]# echo cAt >> word
[root@client ~ 09:29:35]# cat word | grep 'c[a-z]t'
cat
category
acat
concatenate
cbt
[root@client ~ 09:29:38]# cat word | grep 'c[a-zA-Z0-9]t'
cat
category
acat
concatenate
cbt
c1t
c2t
c3t
c4t
c5t
cAt
[^..]
:匹配除括号内字符外的所有字符
bash
[root@client ~ 09:30:00]# cat word | grep 'c[^a-z]t'
c1t
c2t
c3t
c4t
c5t
cAt
通配符
bash
[root@client ~ 09:30:30]# cat word | grep 'c.t'
cat
category
acat
concatenate
cbt
c1t
c2t
c3t
c4t
c5t
cAt
转义字符
将下一个字符标记为 "原义字符" 或 "特殊字符",常见场景:
bash
[root@client ~ 09:31:03]# echo c.t >> word
[root@client ~ 09:31:16]# cat word | grep 'c\.t'
c.t
多条件选择
扩展正则表达式的元字符,用于匹配 "多个选项中的一个"。普通正则需用\|
,扩展正则(egrep
或grep -E
)直接用|
。
bash
[root@client ~ 09:31:18]# cat word | grep -E 'cat|dog'
cat
category
acat
concatenate
dog
非打印字符
终端中不显示的字符,需通过特殊转义序列匹配,常见如下:
转义序列 | 含义 | 等价写法 |
---|---|---|
\cx |
匹配控制字符(如\cM 匹配回车符) |
- |
\f |
匹配换页符 | \x0c 、\cL |
\n |
匹配换行符 | \x0a 、\cJ |
\r |
匹配回车符 | \x0d 、\cM |
\s |
匹配任意空白字符(空格、制表符等) | [ \f\n\r\t\v] |
\S |
匹配任意非空白字符 | [^ \f\n\r\t\v] |
\w |
匹配字母、数字、下划线 | [A-Za-z0-9_] |
\W |
匹配非单词字符 | [^A-Za-z0-9_] |
\t |
匹配制表符 | \x09 、\cI |
\v |
匹配垂直制表符 | \x0b 、\cK |
说明 :grep 命令支持\w
、\W
、\s
、\S
。
bash
[root@client ~ 09:31:18]# cat word | grep -E 'cat|dog'
cat
category
acat
concatenate
dog
[root@client ~ 09:31:39]# ls
anaconda-ks.cfg word
[root@client ~ 09:39:03]# touch cbt
[root@client ~ 09:39:18]# cat word | grep c*t
cbt
[root@client ~ 09:39:27]# cat word | grep 'c*t'
cat
category
acat
concatenate
cbt
c1t
c2t
c3t
c4t
c5t
cAt
c.t
定位符
用于限定字符串在 "行" 或 "单词" 中的位置,常见如下:
定位符 | 功能 | 示例 |
---|---|---|
^ |
匹配行首位置 | grep '^cat' words (匹配以 "cat" 开头的行,输出 "cat") |
$ |
匹配行末位置 | grep 'cat$' words (匹配以 "cat" 结尾的行,输出 "cat""acat") |
\b |
匹配单词边界(单词与非单词的分隔处) | grep '\bcat' words (匹配 "cat" 作为单词开头,输出 "cat""category""hello cat");grep 'cat\b' words (匹配 "cat" 作为单词结尾,输出 "cat""acat""hello cat") |
\B |
匹配非单词边界 | grep '\Bcat' words (匹配 "cat" 不在单词边界,输出 "acat""concatenate") |
< |
匹配单词左边界 | grep '\<cat' words (同\bcat ,输出 "cat""category""hello cat") |
> |
匹配单词右边界 | grep 'cat\>' words (同cat\b ,输出 "cat""acat""hello cat") |
bash
[root@client ~ 10:01:42]# cat word | grep '^cat'
cat
category
[root@client ~ 10:01:57]# cat word | grep 'cat$'
cat
acat
[root@client ~ 10:02:05]# echo hello cat >> word
[root@client ~ 10:02:22]# cat word | grep '\bcat'
cat
category
hello cat
[root@client ~ 10:02:30]# cat word | grep 'cat\b'
cat
acat
hello cat
[root@client ~ 10:02:41]# cat word | grep '\bcat\b'
cat
hello cat
[root@client ~ 10:02:51]# cat word | grep '\Bcat'
acat
concatenate
限定次数
通过元字符限定 "前面子表达式" 的出现次数,仅在扩展正则(egrep
/grep -E
)中生效
限定符 | 功能 | 示例 |
---|---|---|
* |
匹配前面子表达式任意次数(0 次及以上) | grep -E 'do*g' words (匹配 "dg""dog""doog",输出 "dg""dog""doog") |
+ |
匹配前面子表达式1 次及以上 | grep -E 'do+g' words (匹配 "dog""doog",输出 "dog""doog") |
? |
匹配前面子表达式0 次或 1 次 | grep -E 'do?g' words (匹配 "dg""dog",输出 "dg""dog") |
{m} |
匹配前面子表达式恰好 m 次 | grep -E 'do{2}g' words (匹配 "doog",输出 "doog") |
{m,n} |
匹配前面子表达式m-n 次(含 m 和 n) | grep -E 'do{2,3}g' words (匹配 "doog""dooog",输出 "doog""dooog") |
{m,} |
匹配前面子表达式m 次及以上 | grep -E 'do{2,}g' words (匹配 "doog""dooog""doooog",输出对应内容) |
{,n} |
匹配前面子表达式0-n 次 | grep -E 'do{,3}g' words (匹配 "dg""dog""doog""dooog",输出对应内容) |
bash
[root@client ~ 10:22:03]# echo dg >> word
[root@client ~ 10:22:23]# echo dog >> word
[root@client ~ 10:22:33]# echo dooog >> word
[root@client ~ 10:22:37]# cat word | grep 'do*g'
dog
dg
dog
dooog
[root@client ~ 10:22:53]# cat word | grep 'do+g'
[root@client ~ 10:23:05]# cat word | egrep 'do+g'
dog
dog
dooog
[root@client ~ 10:23:16]# cat word | egrep 'do?g'
dog
dg
dog
[root@client ~ 10:23:25]# cat word | egrep 'do{3}g'
dooog
[root@client ~ 10:23:53]# cat word | egrep 'do{0,3}g'
dog
dg
dog
dooog
[root@client ~ 10:24:04]# cat word | egrep 'do{1,}g'
dog
dog
dooog
[root@client ~ 10:24:13]# cat word | egrep 'do{,1}g'
dog
dg
dog