指南内含 1 场可玩狩猎

正则表达式入门:最先要学的 10 个正则

刚接触正则表达式?从这里开始。十个小正则,每个都是一块积木:普通文本、点、字符类、\d、量词、锚点、分支、分组、转义和单词边界。每个示例都可以实时编辑,改一改就能看到变化。

Regex Hunter 标志

· 阅读约 7 分钟

/^c.t$/

抓住

  • cat
  • cot
  • cut
  • c9t

放过

  • ct
  • coat
  • scat
  • cats

正则表达式(regex)是一小段用来描述文本的规则。“三个数字。”“以大写字母开头的单词。”“任何以 .pdf 结尾的内容。”代码编辑器、电子表格、搜索工具和所有编程语言都能理解它。

它看起来晦涩,是因为每个字符都很短,而不是因为概念很难。十个基本构件就能覆盖人们日常使用的大部分内容,本文会逐一介绍。每个示例都可以实时编辑:修改正则,各行会随之更新。

01普通文本匹配它自己

大多数字符就代表它们自己。正则 cat 会在任何位置找到连续的 c、a、t 三个字母:

匹配5/5 符合预期
/cat/

应当匹配3/3

  • cat
  • the cat sat
  • concatenate

不应匹配2/2

  • dog
  • CAT
在沙盒里试试
它也会匹配其他单词里的“cat”。第 10 个正则会解决这个问题。

匹配默认区分大小写,所以 CAT 不算。

02点:任意一个字符

. 恰好匹配一个字符,不管是什么字符:

匹配5/5 符合预期
/c.t/

应当匹配3/3

  • cat
  • cut
  • c9t

不应匹配2/2

  • ct
  • coat
在沙盒里试试
c 和 t 之间有一个字符,任意字符都行。

ct 不匹配,因为 c 和 t 之间什么都没有。coat 不匹配,因为中间有两个字符。

03字符集合:[ ]

方括号表示“这个集合中的一个字符”:

匹配3/3 符合预期
/gr[ae]y/

应当匹配2/2

  • grey
  • gray

不应匹配1/1

  • groy
在沙盒里试试
grey 或 gray,从集合 [ae] 中取一个字符。

方括号内的连字符表示范围:[a-z] 是任意小写字母,[0-9] 是任意数字。关于集合的更多内容,见字符类。

04简写:\d、\w、\s

有些集合有简短的名字。\d 是一个数字,\w 是一个单词字符(字母、数字或下划线),\s 是一个空格或其他空白字符:

匹配4/4 符合预期
/\d\d:\d\d/

应当匹配2/2

  • 09:30
  • meet at 14:05

不应匹配2/2

  • 9:30
  • noon
在沙盒里试试
两个数字、一个冒号、两个数字:像 09:30 这样的时间。

05重复多少次:+ * ? {n}

跟在某个内容后面的量词表示它重复多少次:

量词 含义
+ 一次或多次
* 零次或多次
? 零次或一次(可选)
{3} 恰好 3 次
{2,4} 2 到 4 次
匹配3/3 符合预期
/colou?r/

应当匹配2/2

  • color
  • colour

不应匹配1/1

  • colr
在沙盒里试试
? 让 u 变成可选的,所以两种拼写都能匹配。
匹配2/2 符合预期
/\d{3}-\d{4}/

应当匹配1/1

  • 555-0199

不应匹配1/1

  • 55-0199
在沙盒里试试
恰好三个数字、一个连字符、恰好四个数字。

06开头和结尾:^ 和 $

^ 表示“文本的开头”,$ 表示“结尾”。当整段文本都必须匹配、而不只是其中一部分时,两个都要用:

匹配4/4 符合预期
/^\d+$/

应当匹配2/2

  • 2026
  • 7

不应匹配2/2

  • 2026 AD
  • $20
在沙盒里试试
从最开头到最末尾,只有数字。

如果没有它们,\d+ 会很乐意找到 2026 AD 里的数字。更多内容见锚点与多行模式。

07二选一:|

| 表示“或”:

匹配4/4 符合预期
/^(cat|dog)$/

应当匹配2/2

  • cat
  • dog

不应匹配2/2

  • bird
  • catdog
在沙盒里试试
恰好是 cat,或者恰好是 dog。

括号让 ^ 和 $ 同时作用于两个分支。

08分组:( )

括号把几个字符组合在一起,让量词作用于它们全体:

匹配4/4 符合预期
/^(ha)+$/

应当匹配2/2

  • ha
  • hahaha

不应匹配2/2

  • haa
  • hah
在沙盒里试试
“ha”重复一次或多次。没有分组的话,+ 只会重复 a。

09转义特殊字符:\

. ? + * ( 和 $ 这类字符有特殊含义。要按字面匹配它们,就在前面加一个反斜杠:

匹配4/4 符合预期
/^\d+\.\d\d$/

应当匹配2/2

  • 3.14
  • 19.99

不应匹配2/2

  • 3x14
  • 3.1
在沙盒里试试
\. 是真正的点。普通的 . 也会接受 3x14。

10完整单词:\b

\b 标记单词的边缘。用 \b … \b 把一个单词包起来,就只匹配独立的这个单词,而不会匹配更长单词里的它:

匹配5/5 符合预期
/\bcat\b/

应当匹配3/3

  • cat
  • the cat sat
  • a cat.

不应匹配2/2

  • concatenate
  • cats
在沙盒里试试
作为完整单词的 cat。对比第 1 个正则,它连“concatenate”也匹配了。

11组合起来

一个美式电话号码,比如 555-0199 或 555 0199:三个数字,一个可选的连字符或空格,四个数字,除此之外没有别的:

匹配6/6 符合预期
/^\d{3}[- ]?\d{4}$/

应当匹配3/3

  • 555-0199
  • 555 0199
  • 5550199

不应匹配3/3

  • 555--0199
  • 55-0199
  • call 555-0199
在沙盒里试试
一个短短的正则里,用到了简写、量词、集合、? 和两个锚点。

这就是第 3、4、5、6 个正则在协同工作。大多数实际使用的正则,都只是这些构件的组合。

12试一试

你的第一场狩猎:抓住怪物,放过无辜者。

可玩狩猎标准杆 4

抓住以 ing 结尾的单词。

目标 · 抓住 0/5

  • running目标
  • sing目标
  • thing目标
  • bring目标
  • king目标

无辜词 · 误抓 0

  • ingot无辜
  • singer无辜
  • angle无辜
  • kings无辜
  • ring a bell无辜

输入正则——棋盘会实时更新。

在沙盒里试试
喜欢吗?每天都有新的狩猎。玩今天的狩猎

13检查清单

  • 普通字符匹配它们自己。. 匹配任意一个字符。
  • [abc] 是集合中的一个字符。\d、\w、\s 是简写。
  • + * ? {n} 表示重复多少次。
  • ^ 和 $ 固定开头和结尾。
  • | 表示“或”。( ) 用于分组。
  • \ 让特殊字符变成字面字符。\b 标记单词边缘。

14继续练习