专栏首页京程一灯可以用在 VS Code 中的正则表达式小技巧[每日前端夜话0x68]

可以用在 VS Code 中的正则表达式小技巧[每日前端夜话0x68]

你是不是一直都想学正则表达式,但是因为它的复杂性而被推迟了?在本文中,我将向你展示五个易于学习的正则技巧,你可以立即在自己喜欢的文本编辑器中使用它们。

文本编辑器设置

虽然现在几乎所有的文本编辑器都支持正则表达式,但我在本教程中用的是 Visual Studio Code,不过你可以使用任何你喜欢的编辑器。另请注意,你通常需要在搜索输入框附近的某处打开 RegEx 开关。以下是在 VS Code 中执行此操作的方法:

你需要通过选中此选项启用RegEx

你需要通过选中此选项启用RegEx

1) . —  匹配任何字符

让我们开始吧。点符号 . 用来匹配任何字符:

1b.t

上面的正则匹配 "bot"`"bat"和任何以b开头、t结尾的三个字符的单词。但是如果你想搜索点符号,则需要用 \ 来对它进行转义,所以下面这个正则只匹配确切的文本 "b.t"

1b\.t

2) .*  —  匹配任何东西

这里 . 表示“任何字符”* 表示“此符号重复前面那个内容任何次数。” 把它们放在一起(.*)表示“任何符号重复任意次数。” 例如,你可以用它来查找以某些文本开头或结尾的匹配项。假设我们有一个这样的 javascript 方法:

1loadScript(scriptName: string, pathToFile: string)

我们想找到这个方法的所有调用,其中 pathToFile 指向文件夹“lua” 中的任何文件。可以使用以下正则表达式:

1loadScript.*lua

这意味着,“匹配所有以 "loadScript" 开始同时以"lua"结束的字符串。”

loadScript.*lua: 匹配所有以 "loadScript" 开始同时以"lua"结束的字符串

3) ?  —  非贪婪的匹配

.* 之后的 ? 符号和其他一些匹配规则意味着“尽可能少的匹配”。 在上一张图中,每次匹配都会得到两次 "lua"字符串,直到第二个 "lua" 所有东西才能全部匹配完毕。如果你想匹配第一次出现的"lua",可以使用以下正则:

1loadScript.*?lua

这意味着,“匹配所有以 "loadScript"开头,后面为任意字符,直到第一次出现"lua"

loadScript.*?lua:匹配以 loadScript 开头的所有内容,直到第一次出现"lua"

4) ( ) $  — 捕获组和反向引用

好的,现在我们可以匹配一些文字了。但是如果想要修改我们发现的部分文本呢?这时候就要用到捕获组。

假设我们修改了 loadScript 方法,现在需要在它原来的两个参数之间插入另外一个参数。让我们把这个新参数命名为 id,这时新的函数原型应如下所示:loadScript(scriptName,id,pathToFile)。我们在这里不能用文本编辑器的常规替换功能,不过正则表达式能够帮助我们。

loadScript\(.*?,.*?\)

通过上图你可以看到运行以下正则表达式的结果:

1loadScript\(.*?,.*?\)

这意味着:“匹配以 "loadScript(" 开头的, 后面跟任意内容,直到遇到第一个, ,然后是任意内容,直到第一个)

对你来说,可能看唯一起来比较奇怪的是 \ 符号。它们用于对括号进行转义。

因为符号 () 是正则表达式用来捕获匹配文本部分的特殊字符,但我们需要匹配实际的括号字符,所以需要对它们进行转义。

在前面的表达式中,我们使用.*?符号定义了方法调用的两个参数。要使每个参数作为单独的捕获组,需要在它们的前后分别添加()符号:

1loadScript\((.*?),(.*?)\)

如果你运行这段正则,你将看到没有任何变化。这是因为它匹配的是相同的文本。但现在我们可以将第一个参数称为\$1,将第二个参数称为\$2。这称为反向引用,它将帮助我们做自己想要的事情:在两个参数中间添加另一个参数:

搜索输入:

1loadScript\((.*?),(.*?)\)

这与之前的正则相同,但分别将参数映射到倒了捕获组1和2。

替换输入:

1loadScript($1,id,$2)

这意味着“用文本"loadScript("、捕获组1、"id"、捕获组2和 ) 替换每个匹配的文本 ”。请注意,你不需要在替换输入中转义括号。

替换结果

5) [ ]  —  字符类

你可以在[] 符号内来列出要在特定位置匹配的字符。例如,[0-9]匹配从0到9的所有数字。你还可以明确列出所有数字:[0123456789] —— 与前面的含义相同。你也可以使用带字母的破折号,[a-z] 将匹配所有小写拉丁字符,[A-Z] 将匹配所有大写拉丁字符,[a-zA-Z] 将会匹配两者。

你也可以在字符类之后使用 *,就像在 . 之后一样,在这种情况下意味着:“匹配此类中任意数量的字符”

expect.*to.equal\([0–9]*\): 仅匹配我们期望测试变量等于数字的那些行

后记

你应该知道有几种正则表达式的写法。我在这里讨论的是 javascript RegEx 引擎。大多数现代引擎都很相似,但也可能会存在一些差异。通常这些差异包括转义字符和反向引用标记。

你现在就可以打开文本编辑器,立即开始使用其中的一些技巧。你将看到可以比以前更快地完成许多重构任务。一旦你掌握了这些技巧,就可以开始研究更多的正则表达式了。

原文:https://medium.freecodecamp.org/simple-regex-tricks-for-beginners-3acb3fa257cb

本文分享自微信公众号 - 前端先锋(jingchengyideng)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 风靡一时的精灵收藏原来实现起来so easy, 手把手教你亲手创建一个! | 干货

    说起口袋精灵、以太猫、MLB Crypto Baseball等游戏,你也许不陌生,这些宠物收藏及交易类游戏曾风靡一时。

    区块链大本营
  • 紫涵的Python小课堂---第一讲为什么是python

    我学习python纯粹是因为机缘巧合,大概是我大二的寒假快开学的时候,我没事干在网上搜游戏玩的时候无意之间发现了一个名叫极客战记的游戏,据他介绍是通过写代码来过...

    紫涵
  • 8.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 设计模式- 原型模式(Prototype Pattern)

    易兒善
  • 7 小型制冷设计轻应用程序开发

    [题引]:都9012年了,你还在按着计算器做制冷设计?这里我们介绍使用javascript编程在小型制冷设计中的应用,远离重复烦躁的手工计算。此处选取了...

    周星星9527
  • 2019 前端框架对比及评测

    我们将基于 RealWorld 示例应用对比前端框架。RealWorld 示例应用的特点:

    NXF
  • 0604-6.1.0-如何使用StreamSets实时采集指定数据目录文件并写入库Kudu

    Fayson在前面写过多篇StreamSets的文章,本篇文章主要介绍通过StreamSets实时的方式读取本地的数据文件,通过解析处理将文件中的内容写入到Ku...

    Fayson
  • 女友竟用TA集齐了雪橇三傻! Truffle这口狗粮干货值了…

    老铁们,今天营长手把手带你们开发一款去中心化应用(Dapp)—— 宠物商店,来来来,先看下效果图:

    区块链大本营
  • 关于浏览器渲染VM_ xxx.js的问题

    最近有一个站点涉及到改版的问题,由于时间仓促,有很多css和js 都是直接从合适的资源拿过来用的,这就比较容易导致js冲突和css错乱的问题,在...

    相柳
  • React 学习:综合实例-留言本

    版权声明:欢迎关注博主公众号:矿洞程序员 https://blog.csdn.net/qq_...

    爱明依

扫码关注云+社区

领取腾讯云代金券