4

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

 1 year ago
source link: https://lutaonan.com/blog/everyone-can-use-regexp/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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 的值,用作替换:

"(.+)":
80

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK