Start learning →GlossaryLearning record

正则表达式:模式匹配入门

这门课适合这样的开发者:从 Stack Overflow 粘贴过不少正则,但一让你写、甚至只是读一个正则就卡住。你能说出“这个大概是匹配邮箱的”,可 \d[^a-z]+^(…).+? 在你眼里仍然是乱码。解决办法不是继续收集更多可粘贴的模式,而是把正则赖以构成的那套小字母表一块一块学下来:字面量、字符类、量词、锚点、分组、备选,以及贪婪与懒惰,直到你面对一个陌生模式时能把它的作用说出口。本课用 JavaScript 的正则语法作为具体载体,但这些构件几乎可以迁移到所有语言。

课程结束后你将能够(课程目标):

  • 说出正则表达式是什么,匹配纯字面量文本,并区分字面量字符和特殊字符(元字符)。
  • 用字符类匹配一字符([abc]、范围、取反,以及 \d / \w / \s 简写),并确切知道 . 匹配什么、不匹配什么。
  • *+?{n,m} 控制某样东西重复多少次
  • 用锚点 ^$\b 把匹配钉在开头、结尾或词边界上。
  • 用捕获组从匹配里取出片段,并用备选(|)提供多个选择。
  • 解释贪婪(.+)与懒惰(.+?)匹配的差别,然后在真实控制台里写出并验证一个校验器。

先修条件: 你能读基本的代码:字符串、变量,以及调用 "text".match(...) 这样的函数。不假设任何正则词汇:字符类、量词、锚点、分组、贪婪/懒惰都从零讲起。

练习环境: 你使用自己的浏览器 DevTools 控制台或 Node.js REPL,本课程的练习没有嵌入式沙盒。这里的每个模式都在真实 JavaScript 引擎里运行过,每道练习都指向一个你自己打开的控制台。

课程目录

课号主题你将学到
01匹配纯文本的模式什么是正则、字面量匹配、testmatch 的区别,以及“特殊字符”是什么意思
02匹配一组字符的字符类[abc]、范围、[^…] 取反、\d / \w / \s,以及 . 的真相
03控制重复次数的量词*+?{n}{n,m},以及量词到底附着在什么上
04钉住匹配位置的锚点^$,以及零宽的词边界 \b
05分组与选择捕获组、读取匹配数组,以及用 | 表达备选
06贪婪与懒惰匹配,以及最终实战.+.+? 的区别,以及亲手写出并验证一个真实校验器

来源列表见 sources.md