vim正则表达式
Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作。如果你比较熟悉Perl的正规表达式,可以直接参照与Perl正则表达式的区别一节。
使用正则表达式的命令
使用正则表达式的命令最常见的就是/**搜索命令。其格式如下:
正则表达式
另一个很有用的命令就是:n1,n2s/*/*/gc(替换)命令,将第一个*之间的正则表达式替换成第二个*之间的字符串。
: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
函数式
在替换命令:n1,n2s/*/#/中可以使用函数表达式来书写替换内容,格式为:
: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]
/需要被转义
与其它工具正则不一样的地方在于()也必须(),怪不得我老是弄不出来。
简单命令:
:%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引用前面被匹配的字符)。