当前位置: 首页 > 工具软件 > GVim > 使用案例 >

GVIM之正则表达式

何烨华
2023-12-01

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+表示匹配任意单词

三、实例应用

3.1.替换与删除

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)+表示^(.* )换行后重复操作^(.* )的这个过程进行任意多次。

3.2.替换变量—分组应用

所谓分组,即使用 \ ( 和 \ )符号括起来的正则表达式,即可在其后面使用\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

3.3 函数式

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

1)、将各行的id字符串替换为行号

命令——:%s/<id>/=line(".") (<表示词首,>表示词尾)

2)、将每行开头的单词替换为(行号-10)

命令——:%s/^<w>/=line(".") (<表示词首,>表示词尾)

 类似资料: