参考Vim帮助文档:【pattern.txt】
现在网上讲vim正则的文章多如牛毛,但是大多都只是简单的复制粘贴,转载。甚至还有很明显的错误(比如斜杠反了)。其实vim的帮助手册已经很完善了,也有中文版,而且文章质量非常之高,附带跳转功能,这么好的资料不看,为什么还要在网上找有明显漏斗的资料呢?
很多手册里面也根本没提magic的概念,也没提其实+,?,=不能在vi中使用,也没提贪婪和非贪婪模式
下面我只列举一些我自己常用的正则命令,其他的大家可以通过自带的帮助文档查看(授人以鱼不如授人以渔)
:h pattern
基本用法
在vim里,正则一般就在两个地方使用:
- 查找:
/正则
- 替换:
:s//g
注意::noh[lsearch]
可以关闭高亮
默认vim是大小写敏感,如果要设置成不敏感:
:set ignorecase
在vim手册里提到了magic的
某些字符在模式中是按本义出现的。它们匹配自身。然而,当前面有一个反斜杠时,这些字符具有特殊的含义。
另外一些字符即使没有反斜杠也代表特殊的意思。它们反而需要一个反斜杠来匹配按本义出现的自身。
一个字符是否按本义出现取决于 ‘magic’ 选项以及下面将解释的条目。
可以通过设定magic
或者nomagic
来设定,或者使用\m
表示后面出现的模式采用magic模式,或者\M
表示后面的模式不采用magic模式
魔术
有些字符有特殊作用,如果需要用它的本意,需要加上\
转义
模式 | 作用 |
---|---|
$ | 匹配行尾 |
^ | 匹配行首 |
. | 匹配任何字符 |
* | 前面匹配原的任意次重复 |
| | 分隔可选分支 |
\ | 转义 (按本义) |
本身
模式 | 作用 |
---|---|
\$ | 匹配$ |
\^ | 匹配^ |
\. | 匹配. |
\* | 匹配* |
\\ | 匹配\ |
注意:其他的?
+
=
在vi中都不能使用,所有这里没提,需要使用的自己看手册
字符类
字符 | 说明 |
---|---|
\s | 空白字符; \ 和 \ |
\S | 非空白字符: \s 之反 |
\d | 数位: [0-9] |
\D | 非数位: [^0-9] |
\x | 十六进制数位: [0-9A-Fa-f] |
\X | 非十六进制数位: [^0-9A-Fa-f] |
\o | 八进制数位: [0-7] |
\O | 非八进制数位: [^0-7] |
\w | 单词字符: [0-9A-Za-z_] |
\W | 非单词字符: [^0-9A-Za-z_] |
\a | 英文字母字符: [A-Za-z] |
\A | 非英文字母字符: [^A-Za-z] |
\n | 换行符 |
\_. | 匹配任意一个字符或换行符 |
范围匹配
注意里面的原则,是贪婪还是非贪婪
字符 | 原则 | 说明 |
---|---|---|
[] | 1个 | 匹配括号内的任一个字符(参考上面) |
[^] | 1个 | 匹配 除了 括号内的任何字符 |
\{n} | 尽可能多 | 匹配n次数 |
\{n,m} | 尽可能多 | 匹配n-m次,不指定:n默认为0,m默认为无穷 |
* | 尽可能多 | 匹配0或无穷次 |
\{-} | 尽可能少 | 匹配0或更多 |
\{-n,m} | 尽可能少 | 匹配n-m的范围 |
常用模式
其实一般人能用到的真不多
一般无疑就是:
.*
: 匹配所有字符(不含换行)
\_.*
:匹配所有字符包括换行(在匹配大段含换行文字有奇效)
\s*
:匹配所有空格(用来删除空行)
\d*
:匹配所有数字
\w*
: 匹配所有英文字母
分组
其实我觉得真正在日常生活中用的最多的,反而是这个分组功能,特别是在批量修改html标签的时候
用法:
- 先用
\(
和\)
括住需要保留的部分 - 然后用
\1
\2
……依次选择需要之前保留的分组
比如我要把<div class='test'>
的标签修改成<p>
:%s/<div.*'test'>\(\_.\{-}\)<\/div>/\1/g