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