GVIM/VIM正则表达式常在底行模式下运用,一般用于对同一类的代码进行替换,用时也可以实现删除等操作。
典型的替换命令格式“ :%s/正则表达式/要替换的字符串/选项”
元字符是具有特殊意义的字符。使用元字符可以表达任意字符、行首、行 尾、某几个字符等意义
普通字符 | 含义 |
---|---|
. | 匹配任意字符 |
[abc] | 匹配方括号中的任意字符 |
[^abc] | 匹配除方括号中字符以外的字符 |
\d | 匹配阿拉伯数字,等同于[0~9],decimal十进制 |
\D | 匹配阿拉伯数字之外的任意字符,等同于[^0~9] |
\x | 匹配十六进制数字,等同于[0-9A-Fa-f],heximal十六进制 |
\X | 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f] |
\w | 匹配单词字母,等同于[0-9A-Za-z],正则表达式中一般用"\w+"表示一个单词 |
\W | 匹配单词字母之外的任意字符,等同于[0-9A-Za-z] |
\s | 匹配空白符,等同于[\t] |
\S | 匹配非空白符,等同于[^\t] |
\t | 匹配Tab字符 |
普通元字符通常用来表示数字、单词、空格等。
特殊字符 | 含义 |
---|---|
\ * | 匹配 * 字符 |
\ . | 匹配 . 字符 |
\ / | 匹配 / 字符 |
\ \ | 匹配 \ 字符 |
\ [ | 匹配 [ 字符 |
特殊字符通常用来表示一些特殊的符号。
数量元字符 | 含义 |
---|---|
* | 匹配0~任意个 |
\ + | 匹配1~任意个 |
\ ? | 匹配0~1个 |
\ {n,m} | 匹配n ~ m个 |
\ {n} | 匹配 n 个 |
\ {n,} | 匹配 n ~ 任意个 |
\ {,m} | 匹配 0 ~ m 个 |
上述元字符通常用来表示普通字符(数字、单词、空格)的数量。
位置元字符 | 含义 |
---|---|
$ | 匹配行尾 |
^ | 匹配行首 |
\ < | 匹配单词词首 |
\ > | 匹配单词词尾 |
上述元字符中着色部分为常用的元字符,元字符的应用有些需要注意的地方要加以区分,如下示例:
(1)区分 [ask] 与 \ask
[ask] | 表示匹配 a,s,k 中的任意一个字符 |
---|---|
\ask | 表示匹配ask,将ask作为一个整体看待(实际上就是底行搜索命令) |
(2)区分 [^abc] 与 ^abc
[^abc] | 表示匹配除 a,b,c 以外的任意任意字符 |
---|---|
^abc | 表示匹配以abc为开头的字符串,abc为一整体 |
(3)认清 \ <ace \ > 与 \w+
<ace>\ | 表示匹配固定单词ace |
---|---|
\w+ | 表示匹配任意单词 |
1)、把所有的help或者Help都替换为大写的HELP;
命令 ——:%s/[Hh]elp/HELP/g
2)、 使用单个空格替换一个或多个空格;
命令 ——:%s/ +/ /g
3)、删除所有空行(空行中无任何字符,包括空白符)
命令 ——:%g/ ^ $ /d ——空行中无任何操作
命令 ——;%g/^ \s * $/d——空行中可以包含空白符、Tab键等操作
4)、删除含有某些字符的行
命令 ——:g/ERROR/d
5)、删除每行的所有的前导空格
命令 ——:%s/^ *//g——通过替换命令实现删除效果
6)、在文件中的每一行的开始插入 ->(或其他字符)
命令 ——:%s/^/->/g
7)、在每一行的尾部都加上句号。(或其他字符)
命令 ——:%s/$/。/g
8)、删除以数字开头的行
命令 ——:%s/^\d . *$ //g
9)、删除以[a,b,c]开头的行
命令 ——:%s/ ^ [a|b|c] . *$//g——以替换命令实现删除效果
10)、删除重复行
命令 ——:%s/^\ ( . * \ ) \n \1 $ / \1 / g——将重复的两行压缩成一行
命令 ——:%s/^\ (.*) \ (\n\1 ) +$/ \1 /g——将多行重复行压缩成一行
注:^(. * \)表示以任意字符开头的行,命令中的\n表示换行符,\1表示^(.* )操作重复1次,$表示结尾;\ (\n\1)+表示^(.* )换行后重复操作^(.* )的这个过程进行任意多次。
所谓分组,即使用 \ ( 和 \ )符号括起来的正则表达式,即可在其后面使用\1 ,\2, \3等变量来访问 \ ( 和 \ )符号括起来的内容,分组应用通常用来调换代码位置。
1)、交换列表中所有连字符分隔的条目的顺序
示例 ABC : XYZ 改为 XYZ: ABC
命令 ——:%s/\ (.\ ):\ (.\ )/\2:\1/g
2)、将所有方法foo(a,b,c)改为foo(b,c,a)
示例 foo(bar(8), x+y+z, 5)改为foo(x+y+z,5,bar(8)
命令——:%s/foo( \ ([^ ,] * \ ), \ ([^ ,] * \ ),\ ( [^ ,] * \ ) ) /foo(\2,\3,\1)/g
3)、查找test开头的后面为一个或多个空格,然后为一个单词,将test和该单词调换位置
命令——:%s/^\ (test\ ) \s+ ( \w + \ ) /\2 \1/g
格式——:s/替换字符串/=函数式
1)、将各行的id字符串替换为行号
命令——:%s/<id>/=line(".") (<表示词首,>表示词尾)
2)、将每行开头的单词替换为(行号-10)
命令——:%s/^<w>/=line(".") (<表示词首,>表示词尾)