VIM正则表达式应用

删除连续的多个空白行仅保留一行。
:%s/\(^\s*$\n\)\+/\r/
替换字符\r不能用\n代替否则出现^@,这是vim里的NULL字符标识。

去掉所有的“/* */”注释
:%s!\s*/\*\_.\{-}\*/\s*! !g”
这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的 字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。

想在文章中出现dong的地方加上当前出现的次数,格式为在dong前面加上No(n),其中n表示第几次出现。
写个vim脚本ci_shu.vim
:let i=0 | g/dong/s/dong/\="No(".i.")"."dong"/ | let i+=1
然后在需要修改的文章的进入命令模式:
:source ci_shu.vim
对上面的脚本进行一点解释,其中g/dong/表示每次找到dong就进行后面的替换操作,不能写成:
:let i=0 | %s/dong/\="No(".i.")"."dong"/g | let i+=1
这样写的意思是:表示对全文一次过进行后面的替换操作,但i最后只加了1次。%表示全文操作,替换表达式后面的g表示对每一行中多次出现的dong,进行替换,如果没有g则只替换该行的第一个.

下面看看这个正则表达式:
%s#\(\<\d\+\)\@<=\(\(\d\{3}\)\+\>\)\@=#,#g
难道这就是传说中的天书?没错,这就是vim中的天书:)。不过它实现的功能却是显而易见的。就是把一个完整的数字(指开头到结尾都要是数字,否则有些标识符如var12345678就不是数字,123mygod,12mygod34也不是数字)每三位用逗号断开,如123456789就表示为123,456,789。
解释一下:
    \@=是vim中的零宽词尾断言,\@<=是零宽词头断言。比如这里的\(\<\d\+\)\@<=表示匹配数字开头的单词,且开头一个数字以后的字符间隔——因为零宽断言是不匹配具体的字符的,只匹配间隔,所以在vim中用零宽断言匹配查找后在某个字符上的高亮并不是表示这个字符匹配了,而是紧贴这个字符前的那个间隔被匹配了。这个匹配间隔的功能在查找插入中发挥重要作用。\(\(\d\{3}\)\+\>\)\@=表示从词尾往前走,每3个数字前的间隔就被匹配。综合这两个条件,结果就是:完整数字从词尾往词头看,每三个数字字符间加入一个逗号,但如果词头刚好是3的倍数也不会加逗号,因为不符合\@=的条件。
    除了匹配间隔还可以匹配模式,当零宽断言除了断言参数<assert>外还有模式参数<pattern>时,这个模式参数就是匹配的部分而不是原来的间隔。
格式是:
<pattern>\(<assert>\)\@=

\(<assert>\)\@<=<pattern>
下面这句就是匹配william_djj的william,而william后面不跟_djj的其他单词中的william不匹配
/william\(_djj\)\@=
下面这句就是匹配william_djj的_djj,而_djj前面不是william的其他单词中的_djj不匹配
/\(william\)\@<=_djj
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值