当前位置:首页>Linux>【Linux·基础篇】Shell 基础|正则表达式:文本模式的精密描述语言(一)

【Linux·基础篇】Shell 基础|正则表达式:文本模式的精密描述语言(一)

  • 2026-09-30 16:44:29
【Linux·基础篇】Shell 基础|正则表达式:文本模式的精密描述语言(一)

本文系统介绍了正则表达式的核心概念和语法规则,通过分类整理和详细示例,讲解了如何使用这套精密模式描述语言进行文本匹配。

一、正则表达式基础概念

什么是正则表达式?

正则表达式(Regular Expression,常简写为 regex、regexp 或 RE)不是某个软件的专属功能,也不是某个编程语言的特定语法,而是一种用于描述字符串匹配规则的特殊文本模式。

正则表达式的组成元素

正则表达式由普通字符(如字母 a、数字 1、字符 @)和特殊字符(称为“元字符”,如 .、*、?、[]、^、$)组成,形成一种简洁而强大的模式描述语言,常用于验证用户输入、提取日志信息、批量处理文本等。例如:

^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$

上面是一个匹配邮箱地址的正则表达式,它由以下元素组成:

  • • 字面字符:@、. 等直接匹配自身的字符;
  • • 字符类:[A-Za-z0-9._%+-] 匹配指定范围内的字符;
  • • 量词:+、{2,} 等控制匹配次数;
  • • 定位符:^、$ 匹配字符串的开始和结束。

二、基础语法:从简单到复杂

字面匹配:最基础的匹配方式

字面匹配是最基本的匹配形式,直接匹配字符本身。

表达式
说明
cat
匹配"cat"
apple
匹配"apple"
123
匹配"123"

【注】转义特殊字符与转义

某些字符在正则表达式中有特殊含义,需要转义才能匹配自身。

表达式
说明
\.
匹配点号字符"."本身
\\
匹配反斜线"\"本身
\*
匹配星号"*"本身
\?
匹配问号"?"本身
\$
匹配符号"$"本身

字符类:匹配一组字符

字符类匹配一组字符中的任意一个。

表达式
说明
[abc]
匹配 a、b 或 c 中的任意一个
[^abc]
匹配除 a、b、c 外的任意字符
[a-z]
匹配任意小写字母
[A-Z]
匹配任意大写字母
[0-9]
匹配任意数字
[a-zA-Z]
匹配任意字母
[0-9a-fA-F]
匹配十六进制字符

预定义字符类:常用集合的简写

大多数正则表达式实现提供常用字符类的简写形式,即预定义字符类。

简写
完整形式
说明
\d[0-9]
任意数字
\D[^0-9]
任意非数字
\w[A-Za-z0-9_]
单词字符(字母、数字、下划线)
\W[^A-Za-z0-9_]
非单词字符
\s[ \t\n\r\f]
空白字符(空格、制表符、换行等)
\S[^ \t\n\r\f]
非空白字符
.[^\n]
匹配除换行符外的任意字符(在大多数模式下)

位置匹配:锚定边界

位置匹配(或称锚点)不匹配具体字符,而是匹配字符之间的位置。

锚点
说明
示例
匹配位置
^
匹配字符串开始
^Hello
"Hello world"的开头
$
匹配字符串结束
world$
"Hello world"的结尾
\b
匹配单词边界
\bcat\b
"cat"作为独立单词
\B
匹配非单词边界
\Bcat\B
"cat"在单词内部,如"education"
\A
字符串开始(绝对)
\AStart
仅匹配整个字符串开头
\Z
字符串结束或结束前的换行
end\Z
匹配字符串末尾
\z
字符串绝对结束
end\z
仅匹配字符串绝对末尾

量词:控制匹配次数

量词控制前面元素的匹配次数,即用于重复匹配。

量词
说明
示例
匹配示例
?
0 次或 1 次
colou?r
"color", "colour"
*
0 次或多次
ab*c
"ac", "abc", "abbc"
+
1 次或多次
ab+c
"abc", "abbc"(不匹配"ac")
{n}
恰好 n 次
a{3}
"aaa"
{n,}
至少 n 次
a{2,}
"aa", "aaa", "aaaa"
{n,m}
n 到 m 次
a{2,4}
"aa", "aaa", "aaaa"

【注】贪婪匹配和非贪婪匹配

贪婪匹配和非贪婪匹配是控制量词(如*、+、?、{n,m})匹配行为的两种模式。在匹配时,贪婪匹配是“尽可能多”地匹配,而非贪婪匹配则是“尽可能少”地匹配。关键在于,非贪婪模式会在量词后面加上一个问号?(如 *?、+?、??、{n,m}?)。例如:

  • • 贪婪匹配:<.*> 可以匹配整个字符串 <div>内容</div>;
  • • 非贪婪匹配:<.*?> 只能分别匹配 <div> 和 </div>。

分组与选择

分组() 将多个元素组合为一个单元,便于应用量词或捕获。

非捕获分组(?:) 可以只进行分组但不捕获,这样可以避免捕获不必要的匹配内容‌,让匹配速度更快、资源消耗更低。

选择| 可以匹配多个模式中的任意一个。

表达式
说明
示例
匹配示例
()
分组
(ab)+
"ab", "abab"
(?:)
非捕获分组
(?:ab)+
"ab", "abab"(不捕获)
|
选择(或)
cat|dog
"cat", "dog"

三、小结

正则表达式是一种用于描述文本模式的强大语言,由普通字符和具有特殊含义的元字符(如.、*、[]、^、$等)组合而成。它通过字符类匹配特定集合,用量词控制重复次数,用锚点定位边界,并用分组构建复杂规则。掌握正则表达式,就是学会用这套简洁而强大的语法,将模糊的文本搜索需求转化为精确的模式描述。


此番炼器手札,炉火尚未全熄。若道友观之有趣,或可暂留此间,结一尘缘。待下回开炉铸器,新得感悟,必先与同道分享。

最新文章

随机文章