服务端相关 / 08 Vim 中使用正则表达式

Vim 中使用正则表达式

相信大家对于正则表达式的概念应该不会陌生,正则表达式以一种能够快速匹配文本的方式,同样的作为时下最流行的编辑器,Vim 中也支持使用正则表达式,这个小节就让我们一起来看下如何在 Vim 中使用正则表达式。

1. 正则表达式概念

正则表达式(英文:regular expression),是一种文本模式。它赋予了 Vim 描述和分析文本的能力。可以根据需要,高效地增删改查各种类型得文本和数据。

实际工作中,无论是开发还是运维、测试等从事IT的人来说。正则表达式都是工作中必不可少的。它可以满足高效简洁地查找某些复杂规则的字符语句的需要。比如说以下几个场景:

  • 对身份证号码 / IP 等匹配检查
  • 网页对登陆名为手机号码匹配
  • 特定规律字符串的处理
  • 提取邮件某些开头规律行
  • 可以结合其他额外工具(grep、sed 等)高效处理文本

2. 正则表达式规则

Tips: 正则表达式= 特殊字符(元字符) + 文本(普通字符)

上面的公式其实就是一个完整的正则表达式,你可以简单的将正则表达式理解为是一种语言,元字符就是它的语法,普通字符就是单词。

我们来看一个简单的正则表达式的例子:

下面是一个自动化配置 terraform 的一个配置文件 main.tf。我们会用正则表达式 grep -E ‘(image_id|key name)’ main.tf 来同时匹配这两个字段。

对于不太了解正则表达式的人来说这段简单的公式是有点云里雾里的。下面我们来具体看下正则表达式具体语法规则有哪些,然后再回过头来看就一目了然了。

2.1 正则表达式思维

  • 正则表达式按照字节或者字符作为匹配单位的。而不是单词或者句子。比如上述表达式我们简化下grep -E ‘bat’。 本质上不是匹配的 bat 这个单词,而是匹配 b,a,t 作为连续字符。

  • 字符组:[0-9]:中括号作为正则表达式结构体,可以允许匹配结构体内任意匹配字符。比如这里的 [0-9] 匹配 0-9 之间任意一个数字。

    Tips: 只有字符组内连字符 - 才是元字符。

  • 多选结构:这就是我们刚才演示的例子。(a|b)——小括号中|作为元字符意思是或意思可以同时匹配 a、b.

下面我们来看下常用的具体表达式。

2.2 常用元字符

字符 含义
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

2.3 重复匹配

字符 含义
* 重复零次或更多次
+ 重复一次或更多次
重复零次或一次
{n} 重复n次
{n,} 重复n次或者更多次
{n,m} 重复n到m次

根据这些表达式+上述的正则表达式思想可以解决大部分正则表达式应用。本篇主要针对 Vim 正则表达式讲解所以更加复杂的正则表达式就不再赘述。根据上面的铺垫,下面会结合 Vim 场景应用讲解正则表达式。

3. Vim 正则表达式引擎

Vim 的正则表达式引擎和 Perl 相比不太一样。语法更接近于 POSIX。对于我们一般使用关了 Perl 正则表达式开发人员来说,使用方式的冲突会很不友好。但是通过 magic 开关设置可以满足不同的使用场景。

3.1 magic

根据之前对正则表达式的讲解,我们知道正则表达式中有大量的有特殊含义的元字符。但是在使用 Vim 过程中会对普通用户带来不友好的使用体验。比如要搜索 bat,这里是元字符所以不转义无法搜索到。所以为了满足不同使用习惯和使用人群。Vim 加入了四种不同 magic 模式。

快捷键 含义 解释
\v very magic 除了数字和大小写字母、下划线之外,都有特殊含义
\m magic ^ $ . * ~ []等具有特殊含义
\M nomagic 仅 ^ $具有特殊含义
\V very nomagic 大多数字符都表示其本身,除了反斜杠\

这里我们可以看到如果针对使用习惯一般正则表达式人来说,可以设置为very magic。我们可以针对上面的小例子展示下。
我们会通过\V 和 \v 不同模式下通过正则表达式查找以 resource 开头的行。

可以看到不同模式结果是不一样的。其他两种模式也是类似。大家可以手动自己操作下。

4. 小结

Vim 中正则表达式为了满足不同需求引入了 magic 开关。都有着各自使用场景:

  • very magic: 适用于偏好使用大量正则表达式的开发人员
  • very nomagic: 使用于普通用户,可以不必在意正则表达式元字符转义问题。
  • magic: 这个是开启了正则表达式的简单版,默认可以使用这个模式,兼顾效率和使用场景。
  • nomagic: 这个只用于匹配特定行尾。