跳转至

VS Code 正则指引

预计阅读时长 : 12 分钟

基本概念

正则表达式是一种用于匹配字符串模式的强大工具。它由一系列字符和特殊符号组成,可以用来描述复杂的搜索模式。

正则表达式可以用于文本搜索和替换操作,以及数据验证。举个最最简单的例子,例如 中医院中医医院中心医院 这三个词,使用正则 中\S*医院 就可以同时匹配。

正则表达式在被执行的时候,可以分为两个大的环节:先匹配位置,再匹配文本。以 (?<=武汉市)中\S*?(医|疗养)院 这个正则表达式为例,匹配流程可以细分为以下 3 个部分:

  1. (?<=武汉市):查找文中所有的 “武汉市”,并定位到 “市” 后面的位置
  2. 中\S*?(医院 | 疗养所):严格按照以下顺序,判断 “市” 后面是否是相应的文字
    - :是否紧接着 “中”
    - \S*?:是否紧接着 0 个或者多个文字,文字数量要尽可能的少
    - (医院 | 疗养所):是否紧接着 “医院” 或者 “疗养院”
  3. 如果 1 和 2 的条件都严格满足,则匹配成功;如果有任一条件不能满足,则匹配不成功
    - 匹配成功:武汉市中医院、武汉市中心医院
    - 匹配不成功:武汉市西医院、武汉市医院中心、宜昌市中心医院

在这个过程中,又涉及到字符组、量词、分组、断言、匹配模式等一系列的专有概念。

看起来是不是很复杂?其实真的也挺复杂的,😇 。不过现在有了 GPT 啊,把需求描述清楚,让 GPT 来帮你写就好了。

快捷操作

作为一个文本匹配工具,正则表达式并没有什么能单独发挥作用的场景,但当它与复制、黏贴和替换这些流程融合之后,就变成了一把能屡建奇功的瑞士军刀。

快速选择编辑

先说一个不需要使用正则表达式的文本选择高级技巧。当在 VS Code 选中一段文本时,编辑器会自动查找匹配文件中其他位置相同的文本。这时,如果有编辑的需求,则可以先通过 Cmd+D 逐个添加选中,或者通过 Option+Cmd+D 全部选中,之后再进行批量修改。

当前文件查找替换

除了上面的快捷操作外,还可以通过 Cmd+F 唤出搜索替换面板。只需在查找框中输入需要查找的文本,即可进行实时查找。如果有替换的需求,那在下方的替换框中输入需要替换的文本,再点击批量替换按钮即可完成相应操作。

而不论是搜索还是替换,都能通过开关支持正则表达式,进而实现复杂的批量操作。

多文件查找替换

在运营的日常工作中,还有一个常见而让人头大的场景:对多个文件中相同文本批量进行搜索和替换。

在 VS Code 中,可以通过侧边栏的 唤出多文件搜索替换面板。在这个面板中,可以通过正则表达式来匹配需要查找的文本,然后通过替换框中的正则表达式来进行批量替换。

快速文本提取

如果说上述的查找和修改操作,都属于哪怕效率低点,也还能靠怼时间和人力勉力完成的任务。那么如果想要从大量的文本中,批量提取或者排除符合要求的部分,就属于不掌握点技巧就只能干瞪眼的任务了。

通过使用 Filter Lines ⧉ 扩展可以轻松满足这个需求。 通过 Cmd+L 可以唤出提取面板,然后根据关键词或者正则表达式将符合条件的行提取到新的文件中,而使用 Option+Cmd+L 可以通过排除法将符合条件的行提取到新的文件中。

正则脚本替换

上面的场景都是一些临时性的一次性需求,如果有一些常用的正则表达式替换需求,那可以通过Replace Rules ⧉ 这个扩展预设正则表达式脚本来实现。

先在配置文件中按如下示例进行配置,然后通过 Cmd+R 可以唤出单条规则列表,通过 Option+Cmd+R 可以唤出编组规则列表,最后选择对应的脚本,即可自动完成基于正则表达式的查找和替换操作。

    // Replace Rule

    "replacerules.rules": {
        "Remove &#32; entities": {
            "find": "&#32;",
            "replace": " "
        },
        "Remove Marketplace entities": {
            "find": "\\[([^\\]]*?) - Visual Studio Marketplace\\]",  //(1)
            "replace": "[$1]" //(2)
        }
    },
    "replacerules.rulesets": {
        "Format Markdown Link": {
            "rules": [
                "Remove &#32; entities",
                "Remove Marketplace entities"
            ]
        }
    },
  1. 匹配用正则表达式
  2. 替换用正则表达式

复制粘贴预处理

还有一个更加优雅的处理方式,就是在复制粘贴的时候,直接使用正则对文本进行预处理。通过Markdown Paste ⧉ 扩展,可以通过预设好的正则规则,先对文本进行一次处理,然后直接黏贴处理之后的文本。

    "MarkdownPaste.rules": [
        // FontAwesome 的名称替换
        {
            "regex": "fas fa-([\\w-]+)", //(1)
            "replace": ":fontawesome-solid-$1:" //(2)
        },
        {
            "regex": "fab fa-([\\w-]+)",
            "replace": ":fontawesome-brands-$1:"
        }
    ],
  1. 匹配用正则表达式
  2. 替换用正则表达式

参考资料

速查手册

正则表达式 30 分钟入门教程 ⧉ 是最经典也最精简的正则表达式速查手册,尤其是在掌握了正则表达式的基础知识之后,哪怕长时间不用有些遗忘,也能通过这个页面快速回想起对应的用法来。

这个页面中还有常见正则表达式的链接,配合 @zz 的正则模版,可以覆盖大多数的常见正则需求。

可视化工具

正则可视化 ⧉ 工具挺多,但论对中文的完备支持,这个工具是我目前发现的体验最好的。

不过需要注意的是,这个可视化工具的正则语法基于 Node,虽然大多数情况下都和 VS Code 中的 .NET 语法通用,但可能还是会出现一些差异的情况。

中文教程:

想要真正的深入研究正则表达式,尤其是要有效处理各种复杂的中文问题,正则指引 (第二版) ⧉ 属于必看书目。

在书中,作者深入讲解了正则表达式的语法细节,以及隐藏在语法之后的基本原理,让我这样喜欢刨根问底的人看得十分过瘾。

事实上,我是把这边书当枕边书来看的。作为一个数学渣,这个书属于我少数能完全看懂的可以锻炼脑力的技术书籍。睡前看上 15 分钟,困意忍不住就会袭来,一夜好梦等着我……