使用vim正则表达式

来源:互联网 发布:汽车动力仿真软件 编辑:程序博客网 时间:2024/05/20 08:43

http://blog.sina.com.cn/s/blog_4be5711f0101aj1l.html

几个搜索替换的实用例子。

去掉所有的行尾空格":%s/\s \+$//"。"%"表示在整个文件范围内进行替换,"\s"表示空白字符

(空格和制表符),"\+"对前面的字符匹配一次或多次(越多越好),"$"匹 配行尾(使用"\$"

表示单纯的"$"字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这

个还是比较简单的。

去 掉所有的空白行":%s/\(\s*\n\)\+/\r/"。这回多了"\("、"\)"、"\n"、"\r"和"*"。"*"代表对前面

的字符(此处 为"\s")匹配零次或多次(越多越好;使用"\*"表示单纯的"*"字符),"\n"代

表换行符,"\r"代表回车符,"\("和"\)"对表达式进行 分组,使其被视作一个不可分割的整体。

因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)

替换成为一个单个的换行符。 唯一很特殊的地方是,在模式中使用的是"\n",而被替换的内容

中却不能使用"\n",而只能使用"\r"。原因是历史造成的,详情如果有兴趣的话可以查 看":help

NL-used-for-Nul"。

去掉所有的"//"注释":%s!\s*//.*!!"。首先可以注意到, 这儿分隔符改用

了"!",原因是在模式或字符串部分使用了"/"字符,不换用其他分隔符的话就得在每次使用"/"字

符本身时写成"\/",上面的命令得写 成":%s/\s*\/\/.*//",可读性较低。命令本身倒是相当简单,

用过正则表达式的人估计都知道"."匹配表示除换行符之外的任何字符吧。

去 掉所有的"/* */"注释":%s!\s*/\*\_.\{-}\*/\s*! !g"。这个略有点复杂了,用到了几个不太常

用的Vim正则表达式特性。"\_."匹配包含换行在内的所有字符;"\{-}"表示前一个字符可出现零

次或 多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志"g"表示

一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像 "int/* space not necessary

around comments */main()"这样的表达式在替换之后仍然是合法的。

  希望上面的这些简单的例子能够引起你使用Vim的正则表达式高效完成任务的兴趣。进一步

的信息可参考":help regexp"。