简介:欢迎来到模式匹配的世界!

你有没有试过用“Ctrl + F”在长文件中搜索单词?这确实很有用,但如果你想搜索所有电话号码、电子邮件地址,或是所有以“Z”开头并以“y”结尾的单词呢?普通的搜索功能做不到,但正则表达式 (Regular Expressions) 可以!

在本章中,我们将学习正则表达式(通常简称为 RegEx)和正则语言 (Regular Languages)。这些是计算机科学中用于定义文本模式的强大工具。你可以把它想象成一种“超级搜索”功能,帮助电脑验证密码、寻找数据,甚至构建编译器。

如果起初觉得有点难懂,别担心! RegEx 看起来像是一种奇怪的秘密代码,但只要你掌握了这些符号的“字母表”,你很快就能像专家一样轻松阅读。


1. 什么是正则表达式?

正则表达式是一种描述字符串集合 (set of strings) 的方法。如果一个字符串遵循该表达式的规则,我们就称它为“匹配 (matches)”。

现实生活中的比喻: 想象一家有服装规定的俱乐部。规定写着:“你必须穿蓝色衬衫或红色衬衫,并且必须戴帽子。”正则表达式就像这项服装规定——它是一组规则,告诉电脑哪些“字符串”(成员)是被允许进入的,哪些不是。

关键术语:正则语言 (Regular Language)

正则语言是指任何可以通过正则表达式有限状态机 (FSM) 来描述的语言(一组字符串的集合)。它们就像硬币的两面,相辅相成!


2. 构建组块(语法)

为了建立这些模式,我们使用称为元字符 (metacharacters) 的特殊符号。以下是你在此课程中需要掌握的符号:

A. 选择符号 (Alternation):|

垂直线代表 OR(或)。它让你可以在不同的选项之间进行选择。

示例: \( apple | orange \)
这会匹配字符串 "apple" 或字符串 "orange"

B. 克莱尼星号 (Kleene Star):*

此符号代表前面的字符或组出现 零次或多次

示例: \( a* \)
这可以匹配空字符串(什么都没有)、"a""aa""aaa",依此类推。
记忆技巧: 把星号想象成电影里的“明星 (Staring)”——它可以出现零次,也可以想出现多少次就多少次!

C. 加号 (Plus):+

此符号代表前面的字符出现 一次或多次

示例: \( a+ \)
这可以匹配 "a""aa""aaa"……但它不能为空。你必须至少有一个!

D. 问号 (Question Mark):?

此符号代表 零次或一次(它使字符变成选填的)。

示例: \( colou?r \)
这可以匹配 "color"(零个 'u')或 "colour"(一个 'u')。

E. 组 (Grouping):( )

括号用于将表达式的部分组合在一起,这样像 *+ 这样的符号就会应用于整个组。

示例: \( (ab)* \)
这可以匹配空字符串、"ab""abab""ababab" 等。


3. 逐步拆解:构建表达式

让我们尝试为一个简单的规则建立模式:“字符串必须以一个 'x' 开头,后面接着任意数量的 'y',并以 'z' 结尾。”

第一步: 我们需要刚好一个 'x'。所以我们从这里开始: \( x \)

第二步: 我们需要“任意数量”的 'y'。“任意数量”包括零。所以我们使用克莱尼星号: \( y* \)

第三步: 我们需要在结尾加一个 'z': \( z \)

结果: \( xy*z \)

这可以匹配:"xz", "xyz", "xyyz", "xyyyz"...


4. 正则表达式与有限状态机 (FSMs)

对于你的考试,最重要的一点记住:
正则表达式与有限状态机是等价的。

这意味着如果你能为某种语言绘制一个简单的 FSM(无需使用内存/堆栈),你就可以为它写出正则表达式,反之亦然。它们都定义了正则语言

你知道吗? 电脑实际上会将你的 RegEx 模式转换成内存中的微型 FSM,来检查字符串是否匹配!这是电脑处理规则最快的方法。


5. 要避免的常见错误

1. 混淆 * 和 +
请记住: \( a* \) 可以是空的。 \( a+ \) 不能是空的。

2. 忘记使用管道符号 ( | ) 来表示 OR
如果你想匹配 "cat" 或 "dog",写成 \( catdog \) 只会寻找完整的单词 "catdog"。你必须写成 \( cat|dog \)。

3. 括号位置错误
\( ab+ \) 代表一个 'a' 后面跟着一个或多个 'b' (abbb)。
\( (ab)+ \) 代表一个或多个 "ab" 配对 (ababab)。


重点回顾栏

符号总结:
| :OR(不是这个就是那个)
* :零次或多次(选填,可重复)
+ :一次或多次(必须出现,可重复)
? :零次或一次(严格的选填)
( ) :组(将字符绑在一起)


总结:关键要点

正则表达式是用来描述字符串集合的模式。
正则语言是指任何能被 RegEx 描述的语言。
• 它们用于输入验证(例如检查密码是否包含数字)和数据搜索
RegExFSMs 是等价的;两者都用于定义相同类型的语言。