公告

欢迎来到 Regex Hunter,享受正则高尔夫的乐趣

抓住每个怪物,放过每个无辜者,而且字符越少越好。本文介绍这个游戏是什么、为什么值得一玩,以及第一个帮你压低分数的技巧。

Regex Hunter 标志

· 阅读约 1 分钟

/cat|car|can/

抓住

  • cat
  • carpet

放过

  • cow
  • dog

01最短的路径获胜

每天,Regex Hunter 都会给你两组单词。一组是怪物:你的正则必须抓住它们。另一组是无辜者:你的正则必须放过它们。写出一个正则表达式,抓住所有怪物,不碰任何无辜者,这场狩猎就完成了。

关键在于:每个字符都有代价。能用的正则不是目标,能用的最短正则才是。这就是正则高尔夫,和它得名的那项运动一样,分数最低的人捧走奖杯。

02两个字符的一课

假设狩猎是这样的:

  • 抓住: cat、car、can
  • 放过: dog、bus

最直接的答案是把每个怪物都写出来:

正则11 字符 · 3 个片段
/cat|car|can/

点击片段,在正则中找到它

在沙盒里试试

11 个字符,能用。但仔细看:每个怪物都以 ca 开头,而两个无辜者里都没有这两个字母。正则表达式不必匹配整个单词,只要在单词内部某处找到要找的内容就行。所以这样就够了:

正则2 字符
/ca/
在沙盒里试试

两个字符,结果一样。从“把答案写出来”到“找出怪物共有、无辜者没有的最小特征”,这一跃就是整个游戏的缩影。

03为什么要玩?

正则表达式无处不在:查找替换、日志过滤、表单校验,还有那个没人完全看得懂的配置文件。大多数人只学到够用为止,从来没有真正得心应手过。高尔夫把平常的压力反了过来。你不再只想着“让它跑起来”,而是开始追问“这里到底发生了什么?”,正是这个问题让你终于把语法弄明白。字符类、锚点、分支、量词:你用它们是因为能省字符,记住它们是因为这是你自己挣来的。

而且它本身就很好玩。看着一个 20 个字符的笨拙正则缩成干净利落的 6 个字符,有一种特别的满足感。

04入门的三个习惯

  • 先找共同的子串。 在写分支之前,先问问怪物有什么共同点是无辜者没有的。
  • 别乱加锚点。 ^ 和 $ 要花字符,而且常常没必要。只有当某个无辜者逼你时再加。
  • 多用字符类。 [aeiou] 胜过 a|e|i|o|u,\d 胜过 [0-9]。

05棋盘上见

每天都有一场新的狩猎,如果想先热身,还有全部往期狩猎和练习包。打开今天的谜题,找出怪物的弱点,看看你能把分数压到多低。

狩猎愉快。