简介:欢迎来到模式匹配的世界!
你有没有试过用“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 描述的语言。
• 它们用于输入验证(例如检查密码是否包含数字)和数据搜索。
• RegEx 与 FSMs 是等价的;两者都用于定义相同类型的语言。