随笔-18  评论-11  文章-12  trackbacks-0

      本文中的例子来自与《精通正则表达式》,但我需要用vim中的正则方言来实现他们,以学习vim正则语法。每一个例子,我都会尽量给出所使用表达式所代表的意义。

1. 为数值添加逗号。

       英文中,通常将1234567890这样的数字用逗号三位一组地分割为1,234,567,890以方便阅读。本例用vim替换功能自动实现逗号的添加。

:%s/\d\@<=\(\(\d\d\d\)\+\>\)\@=/,/g

    使用到的语法点包括:
    1)零宽断言\@=与负向零宽断言\@<=,用于匹配位置,而不是匹配文本。
     2)在所有行进行替换:%s,在当前行进行替换:s,在当前行所有未匹配文本中替换
/g
   
3)因为零宽断言匹配的只是位置,所以/g可以为数值添加多个“,”。
    4)\(\(\d\d\d\)\+\>\)表明从匹配点到数值的结尾这个区间内,一共有3的倍数个数字。
    5)\d\@<=\(\(\d\d\d\)\+\>\)\@=表明数值在匹配点前面有数字\d\@<=,后有3的倍数个数字。

:%s/\d\@=\(\(\d\d\d\)\+\d\@!\)\@=/,/g

      翻译过来就是,如果某个匹配点的前面是数字,匹配点和数值最后一个非数字点之间,有3的倍数个数字,那么就在这个匹配点处,加上","

    错误解法:

:%s/\d\@<=\(\d\d\d\)\+\)\@=\d\@!/,/g

2. 贪婪与懒惰

     默认情况下,Vim使用贪婪模式进行匹配,也就是尽可能多地吃进字符。比如使用/a.*b可以匹配axbxb中的axbxb。如果指向匹配axb,那么应该将*替换为\{-},即/a.\{-}b,表示尽可能少地吃进字符。

参考资料:

man vim pattern http://man.chinaunix.net/newsoft/vi/doc/pattern.html 这是最完整的学习资料


类别:Vim 查看评论
文章来源:http://hi.baidu.com/hawkingliu/blog/item/adc94a1687767f4f20a4e9e8.html
posted on 2008-04-27 17:25 ronliu 阅读(2058) 评论(3)  编辑 收藏 引用

评论:
# re: [导入]VIM学习(一)正则表达式 2009-06-01 15:06 | 善用佳软
在“1. 为数值添加逗号。”段中,提供了三行命令。
第一行,正确解法;
第三行,错误解法。

第二行是什么意思?另一个错误?同第一行但写错了?  回复  更多评论
  
# re: [导入]VIM学习(一)正则表达式 2009-06-01 16:03 | ronliu
@善用佳软
命令1对于“1234567890ab”这样的式子就没法替换了。
但命令2仍然可以工作。相比于命令1,其主要改进是增加了表达式结尾非数字的判断。
对命令2
:%s/\d\@=\(\(\d\d\d\)\+\d\@!\)\@=/,/g

:%s/\d\@<=\(\(\d\d\d\)\+\d\@!\)\@=/,/g
两种写法都是可以的。
  回复  更多评论
  
# re: [导入]VIM学习(一)正则表达式[未登录] 2011-08-11 23:26 | eric
只有这个是对的
%s/\d\@<=\(\(\d\d\d\)\+\d\@!\)\@=/,/g
:)  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理