资源描述:
《VIM正则表达式查找替换》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、VIM正则表达式查找替换0.一些需要注意的不同VIM中的正则表达式和其他的有点不一样(1)有些符号要用转义,比如+表示重复一次或以上,其他的还有一些,:hpattern查看(2)非贪婪匹配用{-},如.*{-}匹配尽量短的任意字符(3)i匹配标识符字符[a-zA-Z0-9_],其大写形式表示不包括数字在内的标识符[a-zA-Z_],这两个不是互补的意思,类似的还有kfp,但是s匹配空白字符,S匹配非空白字符,这两个是互补的.tips:按/然后再按方向键的向上,可以找到上次查找的表达式,这样对测
2、试正则表达式方便了不少1.查找C语言的所有函数定义试了无数次,终于写了一个查找C语言中所有函数定义的正则表达式,写这个的目的其实是因为Notepad++的一个插件functionlist里面允许自定义正则表达式,然后可以把这个正则表达式匹配到的内容作为一个列表列出来,这个插件已经自带了C语言的例子,但是这个例子里面有个小错误,就是会把elseif(...)这种格式的也认为是函数,我就想自己修改一下,让这个插件能排除这种情况,因为同时我也在研究VIM,所以就直接在VIM里面测试正则表达式了./s*<(retu
3、rn
4、else)@!w+s+w+s*([^)]*)s*;@!s*$解释一下,不然怕以后自己也看不懂了/这个是向下查找的命令s*匹配0或多个空白(比如空格,Tab等,不匹配换行)顺便说一下,VIM里面,如果要连换行一起匹配,则加个下划线,比如_s匹配包括换行在内的空白,而_.匹配包括换行在内的任意字符(注意,后面有个小数点)<这个是个"零长度匹配",表示单词开头,这种"零长度匹配"只是指定匹配结果需要满足的条件,不匹配实际内容,类似的有很多,用:h/zero-width可以进入VI
5、M的正则表达式帮助,然后用/zero-width查找,再不停的按n,可以找到所有"零长度匹配"的作用(和)其实就是划定一个范围,这个范围内的内容作为一个整体来看,后面可以跟+表示这个整体重复1次或以上,另外这个整体还会保存在寄存器里面,根据出现的先后顺序,分别寸在1~9号寄存器,在同个正则表达式里面,就可以用1到9来指代前面的这个整体,这个用法相当的重要
6、表示"或"的意思,也就是说,只要满足两边任意一个匹配都行,需要注意的是,在括号里面,是把左右两个部分作为整体,而不是只有一个字符,所以不用再加括号了
7、这里排除了return和else,暂时没有发现其他需要排除的,如果发现了,再添上去就好了@!又是一个"零长度匹配",这个的要求是他前面的内容必须不存在,据说类似与Perl的(?!),因为Perl没学过,这个我也不太确定.在这个正则表达式里面,就是表示前面括号里面的return不允许出现,这个地方是我弄这个正则表达式费时最久的地方,一开始找这个用法找了半天,我一直在想,怎么能表示不包含某个单词,本来打算用&,但是没实现,后来终于找到这个东西,才实现了去掉对return的匹配,然后发现,居然匹配到了return的
8、后5个字母,所以又在前面加了一个表示单词开头的<,终于实现了这个功能,为啥我要跟这个return过不去呢?因为有些比如returnaaa();(其中aaa是个函数名,也就是说,把aaa()这个函数的返回值作为本函数的返回值)这样的语句也被匹配上了,排除else的原因在本文一开始就说了.w+匹配一个或一个以上的字母,数字,或下划线,其实就是C语法里面规定能作为函数名,变量名等的字符,相当于[0-9a-zA-Z_],因为大部分的编程语言也都是这么规定的,为了简单起见,就可以用w来代替了,后面的+表示一个或一
9、个以上s+匹配一个或一个以上的空白(这个是匹配左括号本身,因为前面没有斜杠,后面有两个不带斜杆的右括号也是同样的,表示本身[^)]*匹配0个或0个以上的非右括号的内容,这个其实就是为了找到右括号前面的所有内容)匹配右括号到这里,函数就匹配完了,后面的部分是为了去掉带分号的内容,因为函数定义后面不可能有分号,有分号的要么就不是函数,比如returnaaa();这种,要么就是函数的预先声明,所以都要排除有了上面的解释,后面这段基本就没啥解释的了,只要注意最后一个$,这个匹配一行结束,也是个"零长度匹配",如果没有
10、这个符号,那是不能实现去掉分号的功能,因为可以匹配到分号前面的一个字符本来这篇文章的标题是VIM点滴的,不过写着写着,为了个正则表达式就写了这么长,干脆就独立成一篇文章吧.不得不感叹,正则表达式实在是太博大精深了,为了解释的稍微明白点,要花费相当多的笔墨,即使这样,还是不能保证所有的人都能看懂.这个正则表达式还有没考虑充分的地方(主要原因的C语言实在太灵活了)1.没考虑注