本文介绍如何使用Vim的搜索模式。

搜索单词

Vim中使用 \< 和 \> 分别表示单词的开头和结尾,例如查找单词 i 而不是字母 i ,在正常模式下,按下 / 启动搜索模式,输入 \<i\> ,敲击回车即可。

要查找当前光标覆盖的单词,敲击 * ,Vim会自动启动搜索模式,光标移动到该单词下一个现身位置。

搜索当前单词并连续修改

假定当前光标覆盖的单词为 foo,按下 * 键,Vim 会搜索并跳转到下一个 foo 的位置,按下 ciw 组合键,意思是 change inner word ,此时 foo 会被删除,在原位置输入 bar ,然后按下 Escape 键。这就完成了一次搜索并修改,接下来按 n 键继续搜索,如果还需要修改,则按下 . 键表示重复修改动作,如此反复完成连续搜索与修改。

搜索连续重复单词

有时你可能会连续重复输入同一个单词而不自知,例如以下文本:

 hello hello
world world
thank
thank

搜索模式:

\(\<\w\+\>\)\_s*\1

以上搜索模式会匹配文本中的1-4行。在Vim中,使用 \( 和 \) 包括的部分视为一个原子,其中 \(\<\w\+\>\) 匹配一个单词原子,\s 匹配空格符和tab符, \_s 匹配空格符、tab符和换行符, \_s* 匹配0次或多次。

搜索A或B

使用 \| 表示或逻辑,例如 red\|green\|blue 匹配字符串(注意不是单词)red或green或blue。

如果要将匹配的对象替换成新的字符串,可以使用 :%s/搜索正则/新字符串/g,例如将所有的red或green字符串替换为purple:

:%s/red\|green/purple/g

替换所有单词red或green为单词purple:

:%s/\<\(red\|green\)\>/purple/g

Vim具有搜索模式记忆,因此以上命令也可以拆解为两步:

第一步:搜索单词red或green:

/\<\(red\|green\)\>

第二步:将搜索结果替换为purple:

:%s//purple/g

替换命令中搜索正则为空时,Vim会直接使用最后一次使用过的搜索正则作为默认表达式。

有时我们并不想替换结果,而是想要对结果做一些装点,那么可以使用 & 来引用搜索结果,例如以下示例会将文本中所有的单词red或green添加上引号:

:%s/\<\(red\|green\)\>/"&"/g

或者使用分组 \1, \2, \3 ... 来引用搜索结果:

:%s/\<\(red\|green\)\>/"\1"/g
  • 搜索与替换

  :substitute 命令搜索一个字符串并将其替换为新字符串,以下为一些基本使用方法。

:%s/foo/bar/g
全文搜索每个foo并替换为bar。 :s/foo/bar/g
当前行搜索每个foo并替换为bar。 :%s/foo/bar/gc
全文搜索每个foo并替换为bar,替换前需要确认。 :%s/\<foo\>/bar/gc
全文搜索每个单词foo并替换为bar,替换前需要确认。 :%s/foo/bar/gci
全文搜索每个foo并替换为bar,替换前需要确认,大小写不敏感。 :%s/foo/bar/gcI
全文搜索每个foo并替换为bar,替换前需要确认,大小写敏感。 标记g:表示全局搜索,对每一个匹配结果进行操作,缺省标记g,则只对第一个匹配结果进行操作。
标记c:表示操作前需要进行确认。
标记i:表示大小写不敏感。
标记I:表示大小写敏感。
  • 搜索分组

  使用 \( 和 \) 包围住表达式使其成为一个原子,并根据原子所处位置顺序使用\1,\2,……来引用相应的匹配结果。最常见的场景莫过于对调字符串位置,例如:

原文:
1. France VS Germany

命令:
:s/\(France\)\(\sVS\s\)\(Germany\)/\3\2\1

结果:
1. Germany VS France

搜索A与B

使用 \& 表示与逻辑,例如搜索同时包含了 red 和 blue 的行。进行与逻辑搜索时,Vim按照由 \& 分隔的表达式顺序逐一匹配,因此如果开启了高亮匹配结果的功能,那么你看到高亮匹配的永远都是最后一个表达式的匹配结果。

/.*red\&.*blue

反向肯定预查搜索

使用 \(expression1\)\@<=expression2 表示反向肯定预查搜索模式,其过程为首先搜索 \@<= 右侧的原子即 expression2,遇到匹配项后再检查匹配结果左侧是否满足 expression1。例如以下命令会搜索多个冗余0的数字。

原文:
1.0 1.000 1.0100 命令:
\(\.\d\+\)\@<=0\+\> 结果:
匹配了1.000后两个0,1.0100后两个0。

参考一

参考二

参考三

[Vim] 搜索模式(正则表达式)的更多相关文章

  1. (二)、vim即gvim的炫酷搜索模式与技巧

      一.进入搜索模式 1. 打开文件,狂按  <Esc> 进入normal模式,然后按  /  或者  :/  进入搜索模式,添加上关键字例如world,按回车即搜索world: :/wo ...

  2. VIM中的正则表达式及替换命令

    VIM中的正则表达式及替换命令 一.使用正则表达式的命令 使用正则表达式的命令最常见的就是 / (搜索)命令.其格式如下: /正则表达式 另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正 ...

  3. Vim中的正则表达式[转]

    来自:http://blog.csdn.net/endall/archive/2007/08/29/1764554.aspx Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操 ...

  4. 超酷的 Vim 搜索技巧

    尽管目前我们已经涉及 Vim 的多种特性,但此编辑器的特性集如此庞大,不管我们学习多少,似乎仍然远远不足.承接我们的 Vim 教程系列,本文我们将讨论 Vim 提供的多种搜索技术. 不过在此之前,请注 ...

  5. 5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践

    5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 进入编辑模式 小写i在当前字符前插入 大写I 在光标所在行的行首插入 大写O 在光标上面一行插入编辑 小写o在光标下面一行插入编辑 小 ...

  6. vim介绍/vim颜色显示和移动光标/ vim一般模式下移动光标/ vim一般模式下复制、剪切和粘贴

    5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制.剪切和粘贴 vim   是vi的升级版本 vim 带有颜色显示 安装vim : y ...

  7. 进入编辑模式、vim命令模式、vim实践

    第4周第5次课(4月13日) 课程内容:5.5 进入编辑模式5.6 vim命令模式5.7 vim实践 5.5 进入编辑模式 所谓编辑模式就是进入到一个可以编辑文本文档的模式,常规的方式就是按小i进入编 ...

  8. [转帖]vim搜索及高亮取消

    vim搜索及高亮取消 https://www.cnblogs.com/soymilk2019/p/10744027.html 哎 竟然一直不知道. 1. 命令模式下,输入:/字符串 比如搜索user, ...

  9. 在vi vim中使用正则表达式与 普通perl正则的区别?

    参考这篇文章很好 vim中的正则表达式常用的命令有种, 即搜索和替换 /: 搜索 :s 替换 在vim中的正则表达式和perl编程的正则表达式还是有区别的: 正则表达式中的内容包括: 字面字符... ...

随机推荐

  1. 关于使用QTcpSocket的一些总结

    QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险.必须 ...

  2. mac下配置android环境变量

    下面我将一下mac环境下的配置步骤: 1.在本地目录(home directory)中创建文件.bash_profile2.在文件中写入以下内容:export PATH=${PATH}:/Users/ ...

  3. python numpy访问行列元素的方法

    import numpy as np a = np.array([[2,1],[10,5]]) print(a) print(a[:,1])#col 1 print(a[1])#row 1 print ...

  4. 转载:推荐给每个“数据分析师”看的PPT——关于开会的那点事

    推荐给每个“数据分析师”看的PPT——关于开会的那点事 经常对开会“深恶痛绝”,大概的原因有两个,其一,开会之前的准备,各种指标.各种分析.各种PPT,其二,开会中的板凳.废话,尤其是走形式的会议,战 ...

  5. JavaScript资源收集分享,持续更新中。。。

    平时收集的一些JavaScript资源,分享给大家 jQuery UI jEasyUI Extensions http://jqext.sinaapp.com 布局做的挺不错,有比较复杂的菜单导航.P ...

  6. Docker命令之 run

    docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -a stdin: 指定 ...

  7. Netbeans配置Java SE嵌入式平台(树莓派)

    1.配置平台 来源:http://www.cnblogs.com/xiaobo-Linux/p/7955769.html 2. 选择远程 3. 填写信息 JRE 路径是树莓派上的路径:how? sud ...

  8. jQuery:jQuery性能优化28条建议

    http://www.xue5.com/WebDev/jQuery/671700.html 直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将 ...

  9. Java编程思想学习笔记——类的访问权限

    类的访问权限 Java中,访问权限修饰词用于确定库中哪些类对于该库的使用者是可用的. public class Foo{ } 注意点: 每个文件(编译单元)只能有一个public类. public类的 ...

  10. Mapper method 'com.autoyol.mapper.trans.AccountLogMapper.getTotalIncomByMemNoLastest attempted to return null from a method with a primitive return type (int).解决方法

    1.打开日志输出,降低日志级别. <AppenderRef ref="console" level="trace"></AppenderRef ...