vim正则用法

来源:互联网 发布:如何阅读一本书 知乎 编辑:程序博客网 时间:2024/05/16 01:46

Vim中的正则表达式功能很强大,如果能自由运用,会带来很愉快的体验。

一、vim编辑的常用命令

    s

    d

    / ?

vim的这些常用命令可以配合表达式使用。


二、元字符

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

元字符一览

元字符            说明
.                       匹配任意一个字符
[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]。
\u                   匹配大写字符
\U                  匹配非大写字符包括非字母符号
\l                    匹配小写字母
\L                   匹配非小写字母的所有符号

另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号来进行转义。

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



表示数量的元字符

元字符          说明

*                     匹配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的个数相同的字符串,\1 表示 a\+

" 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa

:s/http:\/\/[az\. \+/<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



五、vi 正则表达式练习

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]

/ 需要被 转义

相关资料:

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引用前面被匹配的字符)。
0 0