sourceinsight中使用正则表达式
2016-04-26 16:47
309 查看
转载自:
http://blog.sina.com.cn/s/blog_6826866101014bpd.html http://blog.chinaunix.net/uid-11278770-id-148701.html
正则表达式主要用来做搜索和替换,一般强大一点的编辑器都会支持。si在搜索和替换界面里都有Use
Regular Expression这样的选项。个人认为使用正则表达式(后简称RE)应该是每个程序员都应该掌握的技能。虽然和vim这些相比si对RE的支持还是弱一点,但对于从未了解过RE的人来说,从si这样的编辑器来入门RE也不失为一个好的选择。
学习任何一项科学或技术,了解其涉及的各种概念是第一步,也是比较花时间的一步,我们需要先通读达到大概了解,再实践,在实践中去理解,然后再总结,得出自己的结论,把书本变薄。
RE中的主要概念就是一堆通配符。通配符可以分为两类,一种是表内容的,一种是表数量的。表内容的如:
任意字符
[abc] 任何在[]之内的字符
[^abc] 任何不在[]之内的字符,^表示不在[]之内
还有一些就是转义字符了如\t(tab), \s(space), \w(tab or space)
表数量的如:
* 大于等于0个
+ 大于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。
学习regular
expression的好工具:
http://www.regexlab.com/zh/regref.htm
字符串:
Z:\app\string_copy.c 11 Warning 613: Possible use of null pointer 'source' in
argument to operator 'unary *' [Reference: file Z:\app\string_copy.c: line
9]
表达式:^\([a-zA-Z].*\.c\)\s\s\([0-9]+\)
搞定!!
http://blog.sina.com.cn/s/blog_6826866101014bpd.html http://blog.chinaunix.net/uid-11278770-id-148701.html
正则表达式主要用来做搜索和替换,一般强大一点的编辑器都会支持。si在搜索和替换界面里都有Use
Regular Expression这样的选项。个人认为使用正则表达式(后简称RE)应该是每个程序员都应该掌握的技能。虽然和vim这些相比si对RE的支持还是弱一点,但对于从未了解过RE的人来说,从si这样的编辑器来入门RE也不失为一个好的选择。
学习任何一项科学或技术,了解其涉及的各种概念是第一步,也是比较花时间的一步,我们需要先通读达到大概了解,再实践,在实践中去理解,然后再总结,得出自己的结论,把书本变薄。
RE中的主要概念就是一堆通配符。通配符可以分为两类,一种是表内容的,一种是表数量的。表内容的如:
任意字符
[abc] 任何在[]之内的字符
[^abc] 任何不在[]之内的字符,^表示不在[]之内
还有一些就是转义字符了如\t(tab), \s(space), \w(tab or space)
表数量的如:
* 大于等于0个
+ 大于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。
学习regular
expression的好工具:
http://www.regexlab.com/zh/regref.htm
字符串:
Z:\app\string_copy.c 11 Warning 613: Possible use of null pointer 'source' in
argument to operator 'unary *' [Reference: file Z:\app\string_copy.c: line
9]
表达式:^\([a-zA-Z].*\.c\)\s\s\([0-9]+\)
搞定!!
相关文章推荐
- background
- LSA和pLSA的比较
- 微信与支付宝钱包的竞争分析
- 校园分期支付的机遇和风险
- 使用mysqlbinlog恢复指定表
- Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
- laravel的启动过程
- poj 2342 Anniversary party(树形dp)
- Spring框架运用ajaxFileUpload
- 策略模式
- 3.5.10 判断数字的奇偶
- Android中一些常用的第三方特效架包集合 Android中一些常用的第三方特效架包集合
- Android多种样式的进度条
- 【数字图像处理】利用霍夫变换检测圆形
- hdu 2872 Another Snake 爆搜 判断射线与线段相交
- 最小生成树-BZOJ-1626-[Usaco2007 Dec]Building Roads 修建道路
- android popupwindow位置
- JDK、JRE、JVM三者间的关系
- 【MZ 自测题(套路题)】
- 老鸟的Python入门教程