vim 从嫌弃到依赖(18)——查找模式进阶
上一篇文章中,我们初步结识了如何使用查找模式,也能够通过n和 N进行查找。这篇将会介绍搜索中更高级的用法。另外在写上一篇文章的时候我发现介绍查找相关内容的时候不能用动图来演示,主要是因为输入的内容太多了,剪成动图的话太大了,不一定能上传。第二个就是开启了匹配高亮的选项,比起动图来能更直观的看到匹配的结果。所以这篇文章就不采用动图了。
调整大小写敏感
默认情况下,在搜索时是大小写敏感的,例如下面的例子中,我们无法匹配到大写的REQUIRE的
可以使用 ignorecase
项来取消大小写敏感,例如在 neovim
中写上如下配置
vim.o.ignorecase = true
或者在 vim
的配置文件中写上
set ignorecase
此时在输入 require
时,发现已经可以匹配到 REQUIRE
了
但是在实际使用中我们希望有时候大小写敏感,有时候大小写不敏感,例如想模糊搜索某个函数或者变量的时候。更好的做法是设置 smartcase
项。它只有在输入的字符中有大写才启用大小写敏感,否则就是大小写不敏感。
vim.o.smartcase = true
set smartcase
当然我们也可以在每次搜索的时候单独指定本次搜索是否大小写敏感。可以在匹配时输入\c来不区分大小写而使用 \C区分大小写,这个符号可以出现在任何位置,哪怕你输入 /requ\Cire它也能正确找到所有的 require字符串。
使用正则表达式匹配
vim支持正则表达式的搜索,vim采用的是 POXIS的正则表达式的规则,这就让我们一些习惯 Perl正则表达式规则的人在使用时会出现一些不适宜。现在我们来看一个具体的例子
假设现在有一个 css 文件, 我需要搜索里面的16进制颜色
body { color: #3c3c3c; }
a { color: #0000EE; }
strong { color: #000; }
我们在搜索时输入这样一个正则表达式 #([0-9a-fA-F]{6}|[0-9a-fA-F]{3})
。发现它会报错,但是正则表达式来看,这么写是没问题的,我们要匹配的是以 #
开头,后面有6个或者3个16进制数的字符。
这是因为里面有特殊字符,需要进行转义,例如 ()
在 vim 中有特殊用途,我们将在接下来介绍它的用途。我们需要将正则表达式写成这样 #\([0-9a-fA-F]\{6\}\|[0-9a-fA-F]\{3\}\)
好家伙,反斜杠居然有7个,而且 ()
、{}
需要转义,而 []
不需要转义。正则表达式就够麻烦的了,还得记住vim与其他编辑器的不同,用一次人就麻了。
好在vim提供了 very magic
模式,即除了 _
、 数字、字母之外的所有字符都具有特殊含义,这样我们就不用纠结哪些需要转义,哪些不需要了。可以在搜索的开头添加 \v
来启用这一模式,即我们可以输入 \v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})
我们还可以使用 \x
表示16进制数,以便简化上述正则表达式, \v#(\x{6}|\x{3})
。
\x
是vim 字符类中的一个成员,我认为比较有用的还有如下这些
字符 | 含义 |
---|---|
\x | 十六进制数 |
\X | 非十六进制数 |
\d | 数字 |
\D | 非数字 |
\o | 八进制数 |
\o | 非八进制数 |
\w | 包括字母、数字和 _ |
\W | 不包括 字母、数字和 _ |
\h | 包括 字母和 _ |
\H | 不包括字母和 _ |
\l | 小写字母 |
\L | 非小写字母 |
\u | 大写字母 |
\U | 非大写字母 |
除了有 very magic
模式,vim 中还有 very nomagic
模式,在该模式中所有的字符都只表示它自身,没有特殊含义,例如 .
在正则表达中表示单个字符,但是在 very nomagic
模式中它就表示一个点,它可以匹配点这个字符本身,要启用 very nomagic
模式,可以使用 \V
作为前缀。
使用括号获取子匹配项
在 vim 中可以使用 <(\w+)\_s+\1>
来匹配重复单词,例如
I love python
python is so good
这句话中我们可以匹配到 python
这个单词。
我们来看这个正则表达式,<>
匹配以某些字符开头或者结尾的单词,例如 <Py
将匹配所有以 Py
开头的单词,而 on>
将匹配所有以 on
结尾的单词,因为这里我们的需求并没有要求要匹配以某些字符开头的单词,加上这个就限定我们要匹配单词而不是某些个字符。\_
后面可以加vim字符类中的任意字符,代表在原来的基础之上额外再匹配换行符,例如 \x
可以匹配16进制数,\_x
可以匹配16进制数和换行符。\_s+
就是匹配 <Tab>
空白字符和换行符,并且是匹配1个或者多个。
在vim中使用括号代表子匹配项,它是整个正则表达式匹配的一个子项,例如 Py(tho)n
它可以匹配到 Python
和 Python
字符串里面的 tho
。\后面加数字代表第几个匹配项,第0个匹配项是整个正则表达式的匹配项,1、2、3、....、n 则对应着第1个子匹配项,第二个、第n个子匹配项。
了解了这些,我们就能读懂整个这个正则表达了,它匹配这样一个单词:他是任意单词,但是它后面需要出现一个跟他一样的单词,不管中间包含的是多个空格、制表符或者换行符。
如果我们只是想匹配是否有多个重复的 Python可以这样写: (<Py\w+on>)\_s+\1
界定匹配范围
在搜索模式中,vim把查找域中输入的内容(可以是正则表达或者是原意匹配的字符串)和它匹配的到的高亮的文本进行了区分。一般将查找域中的内容称之为模式,将被高亮显示的文本称之为匹配。一个模式可以对应多个匹配(这里的模式与前面提到的普通模式和插入模式的意思不同)。
一个匹配的边界通常对应着一个模式的起始与结尾。例如 <>
表示一个匹配的边界将是一个单词。除了这个,vim提供了 \zs
和 \ze
这两个元字符来对一个匹配进行裁剪。\zs
表示去掉匹配中开头的指定部分、\ze
表示去掉匹配中结尾的指定部分。
例如在上面这句话中,我通过 <\w+>
匹配到所有的单词。然后通过 <\zsPy\w+>
来对匹配内容进行裁剪,将高亮显示所有单词 Py
以及后面的内容,如果不是以 Py
开头的则完全被裁剪掉了。或者使用 <\w+\zeon>
来裁剪,只显示所有单词 on
前面的部分。
转义特殊字符
这里我们用一个URL 作为例子来演示
https://www.baidu.com/search?q=\\/
假设我们要匹配所有文档中出现的这个url,该如何做呢?
首先考虑在匹配模式中输入一大串的内容,但是这一大串不需要手工输入。我们可以将vim的命令模式和现在的匹配模式看成一个特殊的插入模式中的文本,这样我们就可以使用前面介绍的在输入模式中使用寄存器的例子。先使用 "iy$
粘贴一行,然后在匹配模式中使用 <Ctrl+r>i
来粘贴。
但是这个时候我们发现匹配的结果并不是我们想要的,这是因为在匹配模式中 /
是具有特殊意义的特殊字符,我们需要告诉vim将其解释为普通字符,这个时候可以使用 \V
来进入 very nomagic
模式,该模式与 very magic
相反,将所有字符作为普通字符来解释。
我们会返现它只匹配到了 https:
,并且模式中的字符串也变成了 https:
, 后面从/开始截断了,这时候我们可以使用 \/
对 //
进行转换。同时 \
本身也作为特殊字符,我们也需要对其进行转义。即整个匹配应该输入 https:\/\/www.baidu.com\/search?q=\\\\\/
本篇中主要讲述了如何在vim中使用正则表达式,到此应该已经聊完了vim中查找模式中的基本操作了。后面我们将介绍该如何进行替换操作。
vim 从嫌弃到依赖(18)——查找模式进阶的更多相关文章
- 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)
相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...
- 『学了就忘』vim编辑器基础 — 96、末行模式中的相关命令
目录 1.在文档中显示行号 2.是否显示文档内容相关颜色 3.是否将查找的字符串高亮显示 4.是否显示右下角的状态栏 5.是否在左下角显示如"--INSERT--"之类的状态栏 6 ...
- 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)
1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...
- 《Practical Vim》第五章:命令行模式
前言 出于历史原因,命令行模式又叫 Ex 模式,它具有的功能有: 读写文件:比如 :edit, :write 等等 创建标签页或者窗口:比如 :tabnew :split 操作缓存区,比如: bnex ...
- 迁移到MSYS2 与 Qt 工具链注意的几个事情(g++在链接时,符号依赖项查找遵循从左至右的顺序,但qmake会自动合并造成错误。使用脚本给Mingw32-make创造出一个局部的VC编译环境)
Microsoft Visual Studio 2015社区版提供了强大的开发体验,且 Qt 提供了预编译版本.然而,由于客户提出兼容Windows XP ~ Windows 8.1 这样宽泛的环境要 ...
- Golang的交互模式进阶-读取用户的输入
Golang的交互模式进阶-读取用户的输入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 读写数据除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出. ...
- mac /linux vi/vim永久显示行号开启高亮模式
临时显示:进入vi编辑器,输入命令 :set number //下次在进入vi 无法显示行号 :set nonumber //本次vi关闭行号显示 vi 每次修改后推荐使用命令: sourc ...
- Vim使用技巧(2) -- 插入模式技巧 【持续更新】
组合快捷键 Ctrl + h //删除前一个字母(同退格键) Ctrl + w //删除前一个单词 Ctrl + u //删除到行首 Esc //切换到普通模式 Ctrl + [ //切换到普通模式 ...
- C#设计模式学习笔记:(18)状态模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8032683.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第六个模式--状 ...
- vim /vi中对字符串的查找并替换
vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询. :s/vivian/sky/ 替换当前行第一个 vivian ...
随机推荐
- 无法获得数据库 'model' 上的排他锁。请稍后重试该操作
标题: Microsoft SQL Server Management Studio 数据库 "XXXX" 的 创建 失败. (Microsoft.SqlServer.Smo) 有 ...
- JPA 表名大小写问题
JPA 默认会将实体中的 TABLE_NAME 转成小写如 @Entity @Table(name = "EMPLOYEE") public class Employee { @I ...
- 初探: 通过pyo3用rust为python写扩展加速
众所周知,python性能比较差,尤其在计算密集型的任务当中,所以机器学习领域的算法开发,大多是将python做胶水来用,他们会在项目中写大量的C/C++代码然后编译为so动态文件供python加载使 ...
- 流媒体传输协议之 RTMP
作者:逸殊 审核:泰一 简介 RTMP 在可靠流式传输(TCP)的基础上提供了双向的消息多路复用服务,在通讯双方之间传输与时间相关的并行流数据,如音频,视频和数据消息.协议实现方通常为不同的消息类型指 ...
- POJ:Arbitrage (搜索,汇率换算是否赚?)
POJ 2240 http://poj.org/problem?id=2240 题意:判断是否存在使得汇率增多的环 [任意一个点的汇率增多都可以] Floyd 简单变形 \(w[i][j] = max ...
- 项目2 可视化数据(第17章 使用API)
17.1 使用Web API Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互.这种请求称为API调用.请求的数据将以易于处理的格式(如JSON或CSV)返回. 17.1 ...
- 【每日一题】2.合并回文子串 (字符串处理 + 区间DP)
题目链接:Here 遇到这种数据范围较小的计数问题应该优先考虑dp,本题就是如此. 那么应该怎么样考虑转移呢? 首先最后C中的那个价值最大的子串一定是由字符串A的一个区间和字符串B的一个区间合并得到的 ...
- SAE 联合乘云至达与谱尼测试携手共同抗疫
作者 | 营火.计缘.张祖旺 前言 当前疫情形势依然严峻,各行各业众志成城,携手抗疫.新冠病毒核酸检测筛查是疫情防控的重要一环,如何应对疫情的不断反复,以及每日数以万计的核酸检测结果成为每个检测公司的 ...
- 如虎添翼!高德地图+Serverless 护航你的假日出行
作者 | 刘金龙(福辰) 高德团队 引言 "前方事故多发地段,请注意保持车距..." "您已疲劳驾驶,请注意休息..." "前方经过泰山旅游景 ...
- python之logging日志
一.logging介绍: 使用 logging.debug(text)来打印信息,info等的使用方法与debug一致,都只有一个位置参数 默认日志界别为:会输出warning以上的信息,代码示例: ...