Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作。

如果你比较熟悉Perl的正规表达式,可以直接参照与Perl正则表达式的区别一节。

一、使用正则表达式的命令

使用正则表达式的命令最常见的就是 / (搜索)命令。其格式如下:

/正则表达式

另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。

:s/正则表达式/替换字符串/选项

在学习正则表达式时可以利用 / 命令来练习。

二、元字符

元字符是具有特殊意义的字符。使用元字符可以表达任意字符行首行 尾某几个字符等意义。

元字符一览

元字符 说明
. 匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
[a-z0-9]匹 配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符。
\s 匹配空白字符,等同于[ \t]
\S 匹配非空白字符,等同于[^ \t]

另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。

元字符 说明
\* 匹配 * 字符。
\. 匹配 . 字符。
\/ 匹配 / 字符。
\\ 匹配 \ 字符。
\[ 匹配 [ 字符。

表示数量的元字符

元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个

表示位置的符号

元字符 说明
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾

使用例

/char\s\+[A-Za-z_]\w*;                 " 查找所有以char开头,之后是一个以上的空白," 最后是一个标识符和分号
/\d\d:\d\d:\d\d                        " 查找如 17:37:01 格式的时间字符串
:g/^\s*$/d                             " 删除只有空白的行
:s/\<four\>/4/g                        " 将所有的four替换成4,但是fourteen中的four不替换

三、替换变量

在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1\2 等变量来访问 \( 和 \) 中的内容。

使用例

/\(a\+\)[^a]\+\1                                          " 查找开头和结尾处a的个数相同的字符串," 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa
:s/\(http:\/\/[-a-z\._~\+%\/]\+\)/<a href="\1">\1<\/a>/   " 将URL替换为<a href="http://url">http://url</a>的格式
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1                            " 将 data1 data2 修改为 data2 data1

四、函数式

在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为

:s/替换字符串/\=函数式

在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1\2 等的内容,而submatch(0)可以引用匹配的整个内容。

使用例

:%s/\<id\>/\=line(".")                              " 将各行的 id 字符串替换为行号
:%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1)    " 将每行开头的单词替换为 (行号-10).单词 的格式," 如第11行的 word 替换成 1. word

五、与Perl正则表达式的区别

元字符的区别

Vim语法 Perl语法 含义
\+ + 1-任意个
\? ? 0-1个
\{n,m} {n,m} n-m个
\(和\) (和) 分组

六、vi 正则表达式练习

闲言碎语不要讲…例子说明一切,比如下面这段我需要换成 ubb 标签

vim 命令模式,输入

:%s/.*src=”([^"]*)”[^>]*>/[img]1[/img]/g

替换为

[img ]gu.jpg[ /img]

[img ]os.jpg[ /img]

[img ]hu.jpg[ /img]

[img ]ang.jpg[ /img]

解释如下:

:

命令执行状态

%s

表示查找并替换

%s/a/b/g

a 被查找的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理找到的第一个结果)

([^"]*)

表示非引号的字符N个;外面 () 表示后面替换要用(用 1,…,9等引用)

[/img]

/ 需要被 转义

与其它工具正则不一样的地方在于 () 也必须 (),怪不得我老是弄不出来。

相关资料:

via http://net.pku.edu.cn/~yhf/tao_regexps_zh.html

vi 命令 作用

:%s/ */ /g 把一个或者多个空格替换为一个空格。

:%s/ *$// 去掉行尾的所有空格。

:%s/^/ / 在每一行头上加入一个空格。

:%s/^[0-9][0-9]* // 去掉行首的所有数字字符。

:%s/b[aeio]g/bug/g 将所有的bag、beg、big和bog改为bug。

:%s/t([aou])g/h1t/g 将所有tag、tog和tug分别改为hat、hot和hug(注意用group的用法和使用1引用前面被匹配的字符)。

Sed

Sed是Stream EDitor的缩写,是Unix下常用的基于文件和管道的编辑工具,可以在手册中得到关于sed的详细信息。

这里是一些有趣的sed脚本,假定我们正在处理一个叫做price.txt的文件。注意这些编辑并不会改变源文件,sed只是处理源文件的每一行并 把结果显示在标准输出中(当然很容易使用重定向来定制):

sed脚本 描述

sed ’s/^$/d’ price.txt 删除所有空行

sed ’s/^[ ]*$/d’ price.txt 删除所有只包含空格或者制表符的行

sed ’s/”//g’ price.txt 删除所有引号

最后用一个例子练练手:

最近从博客上复制到vim里的代码都会多了行号,本来vim已经有了行号了,现在想要删除所有行号并且缩进可以这样:

:%s/^[ \t0-9][ \t0-9]//g

中间的^[ \t0-9][ \t0-9]是查找行首的数字,注意\t前面有一个空格。然后替换成空字符(相当于删除)

这时候就会发现所有行号都删除了,但是排版可能就有问题了,解决的方法也很简单。vim自带缩进功能,所以只要:

gg                                (移动到开头)

shift+v                          (大V块选择)

G                                  (移动到行尾)实际上前三行就是全选功能

=                                  (等号vim会自动缩进所选区域,好用的功能)

这样就可以实现全部区域缩进了。vim对c、c++的高亮和缩进看着还是很顺眼的,有时候从网上复制的代码看着很乱,直接复制到vim里面用=全局缩进看着就舒服了,很实用的功能。

vim正则表达式(转)相关推荐

  1. [转] vim 正则表达式 很强大

    毋庸多言,在vim中正则表达式得到了十分广泛的应用. 最常用的 / 和 :s 命令中,正则表达式都是不可或缺的. 下面对vim中的正则表达式的一些难点进行说明. 关于magic vim中有个magic ...

  2. VIM正则表达式详解

    关于magic vim中有个magic的设定.设定方法为: 1.设置magic :set magic 2.取消magic :set nomagic 3.查看帮助 :h magic vim毕竟是个编辑器 ...

  3. Vim正则表达式匹配替换字符串

    /*********************************************************************** Vim正则表达式匹配替换字符串* 说明:* 用Vim用 ...

  4. VIM 正则表达式搜索字符串

    From: http://blog.csdn.net/fengxinze/article/details/6870106 在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个 ...

  5. linux的vim查找的正则表达式,VIM 正则表达式搜索字符串

    在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到匹配字符串,把剩下的字符补全,你 ...

  6. [倚天屠龙记] vim 查找与替换(正则表达式)

    [倚天屠龙记] vim 查找与替换(正则表达式) {{{ 正则表达式是文本处理领域中的一个强大的工具,它可以让文本处理的能力呈指数级的提升,如果一款文本编辑器不支持正则表达式,那么它就算不上是一个现代 ...

  7. VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,倒数第二列, 匹配任意一个字符 :...

    VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下: ...

  8. 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数

    用户定义函数 Haskell 或 Scheme 程序员会告诉您,函数对于任何严肃的编程语言来说都是最重要的特性.对于 C 或 Perl 程序员,他们也会告诉您完全相同的观点. 函数为严肃的程序员提供了 ...

  9. Vim 实用技术,第 1 部分: 实用技巧

    0. Vim 简介 作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱.不过,也许就是因为 Vim 的功能太强大了,要真正用好 Vim 并不容 ...

最新文章

  1. RedHat企业版的安装(一)
  2. ADC和DAC中多通道的含义
  3. BZOJ1084 SCOI2005最大子矩阵
  4. How to consume AIF service(即WCF service) in SSIS project
  5. 梭子鱼邮件归档设备配置
  6. CSS网页制作布局实例教程
  7. docker harbor 域名_超详细的搭建docker私服Harbor教程
  8. 如何在 Outlook 中使用外出时的助理程序
  9. navicat for Oracle连接
  10. Slony-I双机备份
  11. Unity OnTriggerEnter不调用
  12. opencv学习笔记3
  13. vimpython配色_超漂亮 vim 配置:space-vim
  14. 高德上线 “家人地图”功能 家人可随时查看彼此的位置
  15. mysql无法添加或更新子行_MYSQL:错误:无法添加或更新子行:外键约束失败
  16. Hakase and Nano 博弈
  17. L2-008. 最长对称子串-PAT团体程序设计天梯赛GPLT
  18. 生成式对抗网络GAN生成手写数字
  19. sql server 2012 复制数据库向导出现TransferDatabasesUsingSMOTransfer()异常
  20. 中文分词项目(开源/API接口)总结

热门文章

  1. Centos7 连接wifi (PEAP)
  2. OpenCV fitline直线拟合函数学习
  3. 使用CAD镜像和修剪命令绘制图形
  4. 【Excel】乱序不同行数的两列数据对比匹配
  5. 排序算法大比拼(2.1)——时间O(n log2n)篇之归并排序
  6. 沈园恋之沈园诗,自创诗
  7. 在学习JAVA过程中,你遇到的最大的困难是什么?
  8. 大数据与智慧城市建设论坛
  9. IE浏览器跳转无效的问题
  10. 超大模型分布式训练DeepSpeed教程