Matrix 精选
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
正则表达式原本是计算机科学里的术语,后来引入到程序语言中,在工程上也广泛应用。不过,对于大部分读者来说,即使我们不写程序、不做计算机技术相关工作,依然可以在生活、工作中尝试使用正则表达式。许多时候,若是使用正则表达式来完成,往往可以事半功倍。
它让 VSCode 的「查找」「替换」如虎添翼
我们在日常生活或者工作中,总是会碰到需要「批量处理文本」的时候。昨天我朋友在烦恼工作上的一件小事情。她需要处理数百个手机号,每行一个,需要在每个手机号的前后分别加上一个双引号。
13100002222
13100003333
13100004444
13100005555
13312345678
13987654321
最终变成:
"13100002222"
"13100003333"
"13100004444"
"13100005555"
"13312345678"
"13987654321"
也许你会选择手动一行一行敲入引号 "
,亦或会动用 Excel 中强大的公式。然而,使用 Visual Studio Code、Sublime Text 等支持正则表达式替换的文本编辑器,这完全是小菜一碟。
在 VSCode 中,首先使用 option+command+F
(macOS) 或者 Ctrl+H
(Windows)打开「查找替换」栏。在第一行「查找」框中输入 \d+
,在第二行「替换」框中输入 "$0"
,最后点击「替换全部」按钮(在「替换」框右侧的第二个按钮),所有操作就都完成了。
在 Sublime Text 中也是同样的操作。
当然了,为了使用正则表达式的匹配模式,需要在 VSCode 和 Sublime Text 中查找时点亮「.*」的标记。这个按钮在 VSCode 查找框内的最右侧,在 Sublime Text 查找栏的左上角。
现在可以来稍微解释一下这里用到的两个表达式了。
在「查找」框中,我们填入的是 \d+
,意思是「一个或更多的数字」。正则表达式中,\d
表示「数字」,而 +
表示「一个或更多」。
在「替换」框中,我们填入的是 "$0"
,很好理解,就是在前面查找出来的每一个结果两侧加上 "
双引号。这里,$0
可以用来「引用」整个匹配到的结果。
当然了,替换时的 $
符号还可以有 $1
、$2
、$3
……
还是刚才的那些手机号,现在换成了稍微复杂一些的规则。查找时,输入的规则是 (\d{3})(\d{4})(\d{4})
,替换时的规则是 $1-$2-$3
。最后,我们得到了:
在这个规则中,\d{3}
意味着「3个数字」,\d{4}
以为着「4个数字」。于是我通过 \d{3}\d{4}\d{4}
这样一个规则,把号码分成了 3、4、4 的三段。对于匹配到的每一段,我都加上了一个括号。
于是,当我们在「替换」中输入 $1
的时候,它会从「查找」框中寻找第一个括号,并使用匹配到的第一个括号里的内容来替换 $1
的部分。至于 $2
和 $3
,便是在查找时去匹配第二、第三个括号中的内容。
它让 Everything 的搜索比快更快
Everything 是 Windows 上一款颇受好评的文件搜索工具,在 Windows 上实现了文件「即时搜索」的效果。
然而,Everything 搜索文件虽然很快,但是遇到文件名记不清的情况,就只能输入几个关键词,在搜出的一大片文件列表中逐个确认,未免有些费时。
我曾经保存了一个图片,名字就叫 apple
,但是却忘记了它的文件格式。到底是 jpg 还是 png?还是 gif 或者 bmp?也可能是 jpeg 或者 webp?
直接使用 Everything 的普通模式搜索时,会出现数百个结果。
使用快捷键 Ctrl+R
打开「正则表达式」的开关,就可以使用正则表达式来进行匹配了。打开后,在 Everything 右下角的状态栏中会出现「正则表达式」的文字。
这样一来,搜索结果就只剩下了 4 个,寻找起来比刚才省事很多。
我在这里使用的正则表达式也并不复杂。^apple\..{3,}$
中, ^
和 $
分别表示文件名的起始位置和结束位置,意味着在匹配到的结果前后都不再有其他字符。\.
表明一个小数点 .
,也就是文件名和扩展名之间间隔的那个点。后面的 .{3,}
意味着「3 个或更多的任意字符」,匹配了扩展名中可能存在的 3 个或更多字符。
市面上也有一些其他文件搜索工具,使用了和 Everything 相似的技术原理,却鲜见对正则表达式的完备支持。然而,如果没有了正则表达式,这些文件搜索工具速度再快,也是没有灵魂的。
它让 Tasker 和快捷指令锦上添花
当你在你的 Android 手机上收到一条验证码,如何把它快速复制到你的剪贴板里呢?现在各大定制 OS 都提供了「复制验证码」的功能,但是仍需手动点击通知中的「复制」按钮。借助 Tasker 我们可以实现更加自动化的复制。
- 设置 PROFILE,当收到新短信时触发
- 检查短信中是否包含验证码
- 如果包含验证码,提取并复制到剪贴板
- 直接在对应的 APP 里面粘贴
对于其中的第二步「检查短信中是否包含验证码」,就又是正则表达式大展拳脚的地方了。
我这里使用了一个简单粗暴的方式来检查验证码内容:是否包含连续 4-8 个数字。正则表达式用的是 \d{4,8}
,也就是从短信中寻找连续的 4-8 个数字,并放到剪贴板中。
iOS 上的「快捷指令」同样可以使用正则表达式进行匹配和替换。比如下图中的这个快捷指令,可以在分享知乎链接的时候,只复制最精简的的回答链接。
如果直接复制,你得到的可能是这样一大段文字:
三体中,歌者为什么那么轻易就使用二向箔? — 王东凯陪你考注会 的回答 - 知乎 https://www.zhihu.com/question/304759872/answer/1079833112?utm_source=ZHShareTargetIDMore&utm_medium=social&utm_oi=26915779903488
而借助这个快捷指令,你可以直接获得下面的链接:
https://www.zhihu.com/question/304759872/answer/1079833112
用于匹配的正则表达式是这样的:
https://www.zhihu.com/question/\d+/answer/\d+
它可以寻找到符合格式要求的网址,并通过后续的动作复制到剪贴板中。
总之,无论是在 Windows 和 macOS 上处理文本,还是在 Everything 中搜索文件,亦或是在手机和平板电脑上进行自动化的操作,如果一个工具可以支持正则表达式,如果你能够善用正则表达式,那它一定会给你带来许多新的可能性。
© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。