公告
欢迎来到 Regex Hunter,享受正则高尔夫的乐趣
抓住每个怪物,放过每个无辜者,而且字符越少越好。本文介绍这个游戏是什么、为什么值得一玩,以及第一个帮你压低分数的技巧。

Regex Hunter
· 阅读约 1 分钟
/cat|car|can/
抓住
- cat
- carpet
放过
- cow
- dog
01最短的路径获胜
每天,Regex Hunter 都会给你两组单词。一组是怪物:你的正则必须抓住它们。另一组是无辜者:你的正则必须放过它们。写出一个正则表达式,抓住所有怪物,不碰任何无辜者,这场狩猎就完成了。
关键在于:每个字符都有代价。能用的正则不是目标,能用的最短正则才是。这就是正则高尔夫,和它得名的那项运动一样,分数最低的人捧走奖杯。
02两个字符的一课
假设狩猎是这样的:
- 抓住:
cat、car、can - 放过:
dog、bus
最直接的答案是把每个怪物都写出来:
正则11 字符 · 3 个片段
11 个字符,能用。但仔细看:每个怪物都以 ca 开头,而两个无辜者里都没有这两个字母。正则表达式不必匹配整个单词,只要在单词内部某处找到要找的内容就行。所以这样就够了:
正则2 字符
/ca/两个字符,结果一样。从“把答案写出来”到“找出怪物共有、无辜者没有的最小特征”,这一跃就是整个游戏的缩影。
03为什么要玩?
正则表达式无处不在:查找替换、日志过滤、表单校验,还有那个没人完全看得懂的配置文件。大多数人只学到够用为止,从来没有真正得心应手过。高尔夫把平常的压力反了过来。你不再只想着“让它跑起来”,而是开始追问“这里到底发生了什么?”,正是这个问题让你终于把语法弄明白。字符类、锚点、分支、量词:你用它们是因为能省字符,记住它们是因为这是你自己挣来的。
而且它本身就很好玩。看着一个 20 个字符的笨拙正则缩成干净利落的 6 个字符,有一种特别的满足感。
04入门的三个习惯
- 先找共同的子串。 在写分支之前,先问问怪物有什么共同点是无辜者没有的。
- 别乱加锚点。
^和$要花字符,而且常常没必要。只有当某个无辜者逼你时再加。 - 多用字符类。
[aeiou]胜过a|e|i|o|u,\d胜过[0-9]。
05棋盘上见
每天都有一场新的狩猎,如果想先热身,还有全部往期狩猎和练习包。打开今天的谜题,找出怪物的弱点,看看你能把分数压到多低。
狩猎愉快。