source insight研究——正则表达式篇

正则表达式主要用来做搜索和替换,一般强大一点的编辑器都会支持。si在搜索和替换界面里都有Use Regular Expression这样的选项。个人认为使用正则表达式(后简称RE)应该是每个程序员都应该掌握的技能。虽然和vim这些相比si对RE的支持还是弱一点,但对于从未了解过RE的人来说,从si这样的编辑器来入门RE也不失为一个好的选择。

学习任何一项科学或技术,了解其涉及的各种概念是第一步,也是比较花时间的一步,我们需要先通读达到大概了解,再实践,在实践中去理解,然后再总结,得出自己的结论,把书本变薄。

RE中的主要概念就是一堆通配符。通配符可以分为两类,一种是表内容的,一种是表数量的。表内容的如:

任意字符

[abc]任何在[]之内的字符

[^abc]任何不在[]之内的字符,^表示不在[]之内

还有一些就是转义字符了如\t(tab),\s(space),\w(tab or space)

数量的如:

* 大于等于0个(*代表匹配前面一个字符零次或者零次以上。比如你要搜索两个函数的引用:sg_appGetDescop和sg_appAGetDescop,可以使用sg_appA*GetDescop搜索)

+ 大于0个,也就是至少有1个

其它如:

^表示行起始,注意不要把这个^和[]里的^搞混了。

$表示行的结束

要说明的是,不同的工具对RE的支持不太一样,比如强一点的工具支持通配符可能会多一点,转义字符的定义也可能不一样等等。

举个例子理解一下吧,

.*这条RE可以匹配任意的字符串序列,因为.表示任意字符,*表示大于等于0个,连起来理解就是“任意个任意字符”

[abc]+表示“a或b或c出现1次或多次”,像字符串abc,cbac,aacbcb,aaaaa都被可以匹配

如果还不是很理解可以用si的搜索功能自己实践一下。

在理解上面的基础之上就可以使用RE进行替换了,替换和搜索没有什么不同,比如你可以将"[abc]+"替换成"abc",但如果仅仅是这样就没有什么意思了。替换里和RE相关的内容是分组。与分组有关的概念包括

1. 一个分组以\(开始,以\)结束

2. 一个RE中可以有多个分组

3. 引用一个分组使用\1,\2,\3,...

还是举个例子吧,假设我们的代码中有个函数叫func,它的原型定义如下

void func(int var1,int var2)

某天我心血来潮,把func的原型修改成了,

void func(int var2,int var1),

如果没有RE,这下子可就麻烦了,所有调用func的地方都要手工挨个修改,好在有RE。按下Ctrl+h,选择使用RE进行替换,在Old中输入"func(\(.*\),\(.*\))",在New中输入"func(\2,\1)",然后执行,你会发现全部搞定了。

当然ctrl+h只能在本文件搜索替换,要想替换整个工程的,可以使用ctrl+shift+h。

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...