欢迎光临
我们一直在努力

正则表达式(Regex)入门

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

一、正则表达式是什么?

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

目录

一、正则表达式是什么?

二、基础匹配规则

1. 字面匹配

2. 特殊字符(元字符)

位置匹配

字符组

预定义字符组

数量限定符

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

匹配键值对

常用正则

在 AWK 中的特殊用法

使用在线工具练习


二、基础匹配规则

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}的简写

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

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

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

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

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

# 匹配:[section]或 [another_section]

匹配键值对

^[[:space:]]*"KEY"[[:space:]]*=[[:space:]]*\\"([^\\"]*)\\"

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

# 示例匹配:host = "localhost"

常用正则

邮箱地址:
\\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 中的特殊用法

匹配操作符 ~和 !~

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

match()函数

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

我们再看一个例子:

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——游戏化学习

赞(0)
未经允许不得转载:171主机测评 » 正则表达式(Regex)入门
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址