正则表达式(Regex)入门

正则表达式是一种用于匹配和处理文本的强大工具。在运维工作中少不了make脚本部署,所以学习正则匹配还是很重要的。

一、正则表达式是什么?

想象一下:你有一大堆文字,你想快速找到所有电话号码、邮箱地址,或者特定格式的文本。正则表达式就像是一个"文本搜索和匹配的公式"。

二、基础匹配规则

1. 字面匹配

最简单的正则就是直接写你要找的文本。

hello # 匹配 "hello"

error # 匹配 "error"

2. 特殊字符(元字符)

|--------|------------------|---------|--------------------------|
| 字符 | 含义 | 示例 | 匹配 |
| . | 匹配任意一个字符 | h.llo | hello, hallo, hxllo |
| * | 前面的字符出现0次或多次 | he*llo | hllo, hello, heeello |
| + | 前面的字符出现1次或多次 | he+llo | hello, heeello(不匹配 hllo) |
| ? | 前面的字符出现0次或1次 | he?llo | hllo, hello |
| `` | 转义特殊字符 | \. | 匹配实际的点号,而不是"任意字符" |

位置匹配

|--------|-----------|-----------|----------------|
| 字符 | 含义 | 示例 | 匹配 |
| ^ | 匹配行开头 | ^Hello | 只匹配行首的 "Hello" |
| | 匹配**行结尾** | end | 只匹配行尾的 "end" |
| \b | 单词边界 | \bcat\b | 匹配整个单词 "cat" |
[ ]

示例

^Hello.*end$ # 匹配以 Hello 开头,以 end 结尾的整行

字符组

|-----------|-----------------------|-------------|--------------|
| 语法 | 含义 | 示例 | 匹配 |
| abc | 匹配 a、b 或 c 中的任意一个 | aeiou | 任意一个元音字母 |
| a-z | 匹配行结尾 | end$ | 只匹配行尾的 "end" |
| A-Z | 单词边界 | \bcat\b | 匹配整个单词 "cat" |
| 0-9 | 匹配 0 到 9 的任意数字 | ​ \^0-9 | 任何单个数字 |
| \^abc | 匹配不是​ a、b、c 的字符 | \^0-9 | 任何非数字字符 |

预定义字符组

|----------|------------------------|-----------------|
| 快捷方式 | 等价写法 | 含义 |
| \d | 0-9 | 数字 |
| \D | \^0-9 | 非数字 |
| \w | A-Za-z0-9_ | 单词字符(字母、数字、下划线) |
| \W | \^A-Za-z0-9_ | 非单词字符 |
| \s | \\t\\n\\r\\f\\v | 空白字符(空格、制表符等) |
| \S | \^ \\t\\n\\r\\f\\v | 非空白字符 |

数量限定符

|--------|------------|--------|------------------|
| 语法 | 含义 | 示例 | 匹配 |
| {n} | 正好出现 n 次 | a{3} | aaa |
| {n,} | 至少出现 n 次 | a{2,} | aa, aaa, aaaa... |
| {n,m} | 出现 n 到 m 次 | a{2,4} | aa, aaa, aaaa |
| * | {0,}的简写 | | |
| + | {1,}的简写 | | |
| ? | {0,1}的简写 | | |

三、实战解析脚本中的正则

XML 复制代码
\"([^\"]*)\"  # 匹配双引号内的内容,并捕获到分组1
# 分解:
#   \"      匹配左双引号
#   (       开始捕获分组
#     [^\"]*  0个或多个非双引号字符
#   )       结束捕获分组
#   \"      匹配右双引号



/^[[:space:]]*\[/ && /\][[:space:]]*$$/

# 分解为两个部分:
# 1) /^[[:space:]]*\[/
#    ^           - 行开头
#    [[:space:]]* - 0个或多个空白字符
#    \[         - 左方括号 [(需要转义)

# 2) /\][[:space:]]*$$/
#    \]         - 右方括号 ]
#    [[:space:]]* - 0个或多个空白字符
#    $$         - 行结尾

#    匹配:[section]或 [another_section]
匹配键值对
XML 复制代码
^[[:space:]]*"KEY"[[:space:]]*=[[:space:]]*\"([^\"]*)\"

# 逐步理解:
# ^                     - 行开头
# [[:space:]]*         - 0个或多个空白字符
# "KEY"                - 要查找的键名
# [[:space:]]*         - 0个或多个空白字符
# =                    - 等号
# [[:space:]]*         - 0个或多个空白字符
# \"([^\"]*)\"         - 双引号内非引号的内容

# 示例匹配:host = "localhost"
常用正则
XML 复制代码
邮箱地址:
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b

手机号码(中国)
1[3-9]\d{9}

IP地址
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

日期(YYYY-MM-DD)
\d{4}-\d{2}-\d{2}

URL
https?://[^\s]+
在 AWK 中的特殊用法

匹配操作符 ~!~

XML 复制代码
$1 ~ /^Error/     # 第一列以 Error 开头
$2 !~ /[0-9]/     # 第二列不包含数字

match()函数

XML 复制代码
match($0, /pattern/, arr)
# 将匹配结果存入数组 arr
# arr[0] = 整个匹配
# arr[1] = 第一个分组
XML 复制代码
match($$0, "^[[:space:]]*"KEY"[[:space:]]*=[[:space:]]*\"([^\"]*)\"", m)
# 匹配到的结果存入数组 m
# m[0] = 整个匹配(如:host = "localhost")
# m[1] = 第一个分组(如:localhost)

我们再看一个例子:

XML 复制代码
match($$0, "^[[:space:]]*"KEY"[[:space:]]*=[[:space:]]*(true|false)", m)

原始字符串:enabled = true

匹配过程:
1. ^                    从行首开始
2. [[:space:]]*        匹配0个或多个空白(这里可能是0个)
3. "KEY"               替换为实际的键名 enabled
4. [[:space:]]*        匹配0个或多个空白
5. =                   匹配等号
6. [[:space:]]*        匹配0个或多个空白
7. (true|false)        匹配 true 或 false
8. 结果:m[0] = "enabled = true",m[1] = "true"
使用在线工具练习

regex101 ------交互式学习

RegExr------ 实时测试

regex_learn------游戏化学习

相关推荐
weixin_4462608510 分钟前
PromptMatic:通过多阶段提示优化提升大模型的指令遵循能力
运维·服务器
pt104310 分钟前
从恐惧到自动化的百年突围
运维·自动化
HackTwoHub11 分钟前
AI自动化信息收集赋能渗透测试!集成多款主流扫描工具,多维智能评分,精准锁定高危资产
运维·人工智能·安全·web安全·网络安全·自动化·系统安全
j7~13 分钟前
【Linux】三十五.网络基础(三)《从零实现一个C++ HTTP服务器:完整项目实战》----万字详解
运维·网络协议·http·网络层·服务层·协议层·http的实现
吴声子夜歌15 分钟前
Shell脚本——数组
linux·运维·shell
yuewell_ai28 分钟前
具身机器人一多服务器就崩-告别轮询上事件驱动
运维·服务器·机器人
道尔柯南38 分钟前
【Linux】进程信号----1
linux·运维·服务器
逐流人42 分钟前
华为云服务全景指南:从基础架构到运维实践
运维·华为云·云计算·云服务·ecs
豆芽脚脚43 分钟前
华为鲲鹏arm服务器部署DeepSeek-V4-Flash-0731-w8a8
运维·服务器·arm开发
Mortalbreeze1 小时前
深入理解 Linux IO 模型(四):多路复用 —— epoll
linux·运维·服务器·网络·tcp/ip