每个人都能用点正则表达式

2022/09/19

有一个关于正则表达式的笑话是这么说的:我们遇到了一个问题,用正则表达式解决了,现在变成了两个问题。

这个笑话说明了正则表达式的复杂,有时还难以维护。如果我们刚接触一个现有的项目,里面出现了正则表达式,我们的第一反应肯定是头疼。因为正则表达式不易读,通常要读好几遍才能稍微弄懂他的意图。

包括我也一样,在很长一段时间里,我对正则表达式的态度是能不用就不用。直到几年前我读完了《精通正则表达式》这本书,我对正则表达式的态度发生了巨大的变化。

这本书的第一章的第一节名字是「解决实际问题」,我在这第一节就领略到了正则表达式的魅力。也让我意识到,你不一定需要正则表达式,但你必需掌握正则表达式的基础,克服对它的恐惧,把它转化成你的工具之一。 在以后,当你又遇到一个问题,你就会意识到正则表达式是其中的一种优雅的解法。当你把正则表达式作为自己的一种工具后,你会发现一些以前你认为需要写一段程序去解决的问题,其实只需要一行正则表达式就能解决。

例如,我通常想要把一个 JSON 文件转换成一个 JavaScript 对象,我想要把 JSON 里的 key 的双引号去掉。以前我可能会先 Google 一下 “JSON to JavaScript object” 看看有没有现成的工具,而现在我首先就会想到,这个问题用正则表达式配合编辑器自带的替换功能就能解决。

假设这是我们想要转换的 JSON:

{
  "name": "Randy",
  "children": [
    {
      "name": "Sandy"
    },
    {
      "name": "Mandy"
    }
  ]
}

我的思路会是:首先我要匹配出所有的 key, 而 key 的特征是以双引号开头,以双引号结尾,后面一定会带上一个冒号,所以我可以用这样一句正则把所有的 key 找出来:

".+":

这里的 . 表示任意字符,+ 则表示匹配一个或多个。

正则表达式其中一个强大的特性是可以把某一个匹配用括号包起来,让它变成一个 group, 这些 group 会以数字编号,从 1 开始。这样我们可以在匹配后,用 $1 这样的形式把匹配到的 group 的值拿出来再处理。在这个例子中,我们用 VS Code 的替换功能,把 key 匹配出来,然后把它放在一个 group 里,在替换的时候,再用 $1 得到 key 的值,用作替换:

"(.+)":

还有很多例子,读者可以举一反三。这篇文章的目的不是教大家正则表达式的用法,而是让大家能意识到,正则表达式是一个很实用的工具,不一定要在项目中用到,在日常的一些文本处理任务中,它能发挥出你意想不到的作用。而正则表达式的基本用法不难记,多用几次就会烂熟于心。当然更高级的用法,也是需要多翻手册的。


通过支付宝 [email protected] 或赞赏码赞助此文