正则表达式 - 你必须掌握的

简介:

很多人不愿意修改公共代码,因为公共代码一修改,将可能影响到别的工程代码,必须同时修改大量的别的工程代码。对于简单的修改,比如函数名修改,使用简单的批量查找替换就可以完成。但如果遇到更加复杂的情况,很多人手足无措,只能一个一个的手工修改。《卓有成效的程序员》里有这么一个故事:

 “事情发生在一个项目中,那个项目已使用了1000个EJB(Enterprise Java Bean),当时决定所有的非EJB方法(就是说除了EJB托管的回调方法之外的所有方法)都需要一个额外的参数。原本估计需要一个人花6天来手工完成。但一个熟悉正则表达式的开发人员,用他信赖的编辑器(Emacs)仅使用两个小时就完成了所有的替换。也就是那一天开始,我决定好好学习正则表达式。

可以想象一下,一个原本6天的手工工作量, 最后只需要两小时。(1小时58分钟建立正确的语法,然后不足两分钟时间去执行。)

一、学习正则表达式

曾有人总结了程序员的七种武器,其中就有“正则表达式”。如果你现在对正则表达式还是一知半解,好好的静下心来,用心花上2个小时,仔细学习和研读一下正则表达式语法规则,是绝对值得的。要学习正则表达式,资源非常多。 如果想要系统的学习,建议看《精通正则表达式》等书。如果你想要快速入门,我推荐一下园里最近很火的Jimmy Zhang曾经写过的一个简易教程:

学习资源:

http://www.cnblogs.com/jimmyzhang/archive/2007/10/24/936151.html (花上1-2个小时仔细学习,然后反复实践,能够很快上手)

正则表达式工具:

我首推RegexBuddy了。下面这个地址里有RegexBuddy3.2.1完整版的下载地址(如果你仔细浏览这个网站,会发现此人是一个正则表达式狂热分子):

http://iregex.org/blog/regexbuddy321.html

二、实例

接下来,我们回到开头讲到的修改公共库的问题。我来举一个的例子,我们设计了一个Game类,提供Start实例方法如下:

复制代码
public   class  Game
{
    
public   void  Start( int  totalTime,  string  gameName)
    {
        
//  
    }
}
复制代码

 

然后,该方法被大量其他代码使用。直到某一天,我们决定将Start方法的两个参数顺序对换,因为gameName作为第一个参数看起来更加顺眼。。。然后,我们观察了一些使用到Game类的代码,发现有非常多的地方使用到了该代码,但几乎的代码都使用了类似如下的方法调用Start方法:

复制代码
Game game  =   new  Game();
game.Start(
1 " NancyTetris " );

Game myGame 
=   new  Game();
int  totalTime  =   10 ;
string  gameName  =   " NancyGLine " ;
myGame.Start(totalTime, gameName);
复制代码

 

当然,实际情况下,调用该方法的代码千奇百怪,对于某些复杂情况,想要通过一个正则表达式达到完美的批量替换确实很难。这里,我就将问题简化一下,只是给大家提供一个思路。我假设所有调用该方法的代码都使用了如上的方法进行调用。(为了简化正则表达式,易理解,我假设调用代码都遵循代码规范,不会去多出一些多余的空格,也不胡乱换行。)

那么,一个怎样的正则表达式能够将上面的一段代码中的Game实例的Start方法的两个参数调换呢?

答案:

搜索:Game (\w+) = new Game\(\);([\W\w]*?)\1.Start\(([\w\"]+), ([\w\"]+)\);

替换:Game $1 = new Game();$2\1.Start($4, $3);

这个例子很常见,也很有用,如果你还不会,请耐心花上2个小时学习,然后解决它!

在实际的批量搜索替换过程中,你肯定会遇到各种各样的麻烦,因为你会发现,调用它的代码风格千差万别,比如上面的例子,可能有人将Game实例做为一个参数传递到了另外一个函数(甚至这个函数在另外一个文件里),如:

复制代码
public   void  Do()
{
    Game game 
=   new  Game();
    Foo(game);
}

//  Foo方法可能在另外一个文件里
public   void  Foo(Game game)
{
    game.Start(
1 " NancyTetris " );
}
复制代码

 

甚至,某些人不符合代码规范的怪异写法也会让你非常头疼。你会发现一个正则表达式已经不能一次性做完所有事情,这时,你也许需要编写一定的脚本进行更加复杂的处理,假如正则表达式这把武器在你的手上运用自如,你是否会感觉一切都变得那么简单呢?如果你有更多实际的正则表达式批量替换的经验,欢迎分享!

 

 

本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2009/07/16/1525170.html,如需转载请自行联系原作者

相关文章
|
3月前
|
自然语言处理 JavaScript 前端开发
正则表达式完整指南(上)
正则表达式完整指南(上)
|
5月前
|
人工智能 机器人 Unix
正则表达式的应用
正则表达式的应用
60 0
|
10月前
常用正则表达式
常用正则表达式
42 0
|
10月前
|
人工智能 数据安全/隐私保护
一些常用的正则表达式
今天在写一些输入验证的时候用到了正则表达式,现在就回顾一下我们常用的正则表达式,对于正则表达式的写法很多种,看个人的习惯了,我的写法也许不是很好,但可以满足基本需求。
81 0
|
11月前
|
前端开发 数据安全/隐私保护 Windows
常用的20个正则表达式
常用的20个正则表达式
242 0
|
新能源 Java Linux
你必须掌握的常用正则表达式大全
你必须掌握的常用正则表达式大全
946 1
你必须掌握的常用正则表达式大全
|
数据安全/隐私保护
正则表达式_2
学习自编程胶囊课程。
88 1
正则表达式_2
|
Web App开发 JavaScript 前端开发
正则表达式小记
什么是正则表达式 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、replace、search 和 split 方法。
1186 0

热门文章

最新文章