提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述字符串模式的强大工具,它通过一系列预定义的符号和规则,匹配、查找、替换文本中符合特定模式的内容。无论是文本处理、数据提取、表单验证,还是日志分析、代码搜索,正则表达式都能大幅提升效率,是编程、运维、数据分析等领域不可或缺的技能。

一、正则表达式

1.1 定义

正则表达式(Regular Expression, regex/regexp/RE)是一种用来描述字符串模式的规则。
功能:检索、替换、过滤符合特定规则的字符串。

1.2 用途

系统日志筛选(如定位“登录失败”“服务启动失败”)
配置文件解析
文本查找替换
脚本编程中的条件匹配

1.3 Linux 正则表达式分类

1. BRE (基础正则表达式)
传统语法,功能有限
量词 {} 需要转义 {n,m}

  • , ? , () 需要转义
    常用工具: grep 、 sed
  1. ERE (扩展正则表达式)
    功能更强大,语法简洁
  • , ? , () , {} , | 等无需转义
    常用工具: egrep ( grep -E )、 awk

1.4 正则表达式组成

1.4.1 普通字符

字母、数字、标点符号等本身。

1.4.2 元字符

. 匹配任意单个字符
匹配任意单个字符(除 \r\n ),就是“通配符”,你想匹配啥都行一个字符
[] 匹配字符集 [a-z] [0-9] [A-Z]
匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]
[^list] 匹配非集合中的字符
匹配任意不在list列表中的一个字符 例: [a-z]、[0-9]、[^A-Z0-9]
^ 行首
$ 行尾
\ 转义符

1.4.3 重复次数

扩展
egrep、awk使用{n}{n, }{n, m}匹配时“{}"前不用加"\”
egrep -E -n 'wo{2}d' test.txt //-E 用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' test.txt
案列:
+ 作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串
? 作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串
| 作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串
() 作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,
所以将“a”与“e”
列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串
()+ 作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上
的"xyz"字符串的意思

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、grep —— 条件查找

常用选项
-E :启用扩展正则
-c :统计匹配行数
-i :忽略大小写
-o :只输出匹配内容
-v :反向匹配(不包含的行)
-n :显示行号
–color=auto :高亮匹配

grep -c root /etc/passwd # 统计 root 出现的行数 grep -i “the” web.sh #
不区分大小写匹配 grep -v root /etc/passwd # 输出不包含 root 的行 grep -o
‘[0-9]+.[0-9]+.[0-9]+.[0-9]+’ ifconfig.out | head -1 # 提取 IP 地址
ifconfig | grep -o ‘[0-9]+.[0-9]+.[0-9]+.[0-9]+’ | head -1 提取 IP 地址

在这里插入图片描述
0-9]+:匹配一个或多个数字(0-9)。
.:匹配一个点号(.),由于点号是正则表达式中的特殊字符,需要用 \ 转义。
整个模式由四组 [0-9]+ 和三组 . 组成,对应 IPv4 地址的四段数字(如 192.168.1.1)。

三、基础正则 vs 扩展正则

3.1 常见的BRE元字符

BRE 常见元字符
^ 行首
$ 行尾
. 任意单字符
[list] 匹配字符集
[^list] 反向匹配

  • 0 或多次
    {n} 精确次数
    {n,} 至少 n 次
    {n,m} n~m 次

3.2ERE 新增功能

  • 一个或多个
    ? 0 或 1 次
    | 或者(OR)
    () 分组
    ()+ 匹配重复的组

四、扩展正则表达式(ERE)元字符

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。

例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行(通常用于查看生效的配置文件),执行grep -v ‘^KaTeX parse error: Expected group after '^' at position 23: …txt | grep -v ‘^̲#’即可实现。这里需要使用管道…|^#’ test.txt,其中,单引号内的管道符号表示或者(or)。

4.1 查找特定字符

grep -n 'the' test.txt # 查找 the
grep -vn 'the' test.txt # 反向匹配

4.2中括号集合

grep -n 'sh[io]rt' test.txt # shirt 或 short
grep -n '[^w]oo' test.txt # 前面不是 w 的 oo

4.3定位符

grep -n '^the' test.txt # 行首是 the
grep -n '\.$' test.txt # 行尾是 .
grep -n '^$' test.txt # 空行

在这里插入图片描述

4.4 点与星

grep -n 'w..d' test.txt # w 开头 d 结尾,中间两个字符
grep -n 'woo*d' test.txt # w 开头 d 结尾,中间 o 可有可无
grep -n 'w.*d' test.txt # w 开头 d 结尾,中间任意字符
执行以下命令即可查询任意数字所在行。
grep -n '[0-9][0-9]*' test.txt

在这里插入图片描述

4.5 次数限定符

#查询两个 o 的字符。
grep -n 'o\{2\}' test.txt # oo
#查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
grep -n 'wo\{2,5\}d' test.txt # w 开头 d 结尾,2-5 个 o
#查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
grep -n 'wo\{2,\}d' test.txt # 至少两个 o >=2

正则表达式是一种用来描述字符串模式的规则。功能:检索、替换、过滤符合特定规则的字符串。
元字符

通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个
^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^”
字符本身,请使用“^”
$ 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。 要匹配“”字符本身,请使用“$”
. 匹配除“\r\n”之外的任何单个字符
\ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
” 匹配前面的子表达式零次或多次。要匹配“”字符,请使用“*”
[] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
[^] 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plin”中任何一个字母
[n1-n2] 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意
一个小写字母字符。

总结

正则表达式是一把 “双刃剑”:用得好可以大幅提升文本处理效率,用得不好则可能导致模式匹配不准确或性能低下。因此,在实际应用中,需根据具体需求选择合适的模式,必要时结合其他文本处理工具(如 awk、sed、Python 字符串方法)协同工作。

更多推荐