随笔 - 35  文章 - 10 评论 - 1040 trackbacks - 16

.net asp web c# vb VS2005 VS2008 VS2003

    姓名 景春雷
    网名 1-2-3
    生日 1980.2.29
    城市 沈阳
下午的聚会聊得很开心。照片:链接 6-7 20:01

与我联系

常用链接

我参与的团队

我的标签

随笔分类(36)

随笔档案(35)

文章分类(10)

相册

收藏夹(2)

积分与排名

  • 积分 - 125992
  • 排名 - 273

最新评论

阅读排行榜

评论排行榜


        宁可累死,也要偷懒。
                             ——1-2-3

摘要

你绝对不曾见过的正则表达式另类应用。
就算说我是恶搞也不为过。
欢迎鸡蛋和板砖。

引子

不知你是否也和笔者一样,喜欢先写10个8个的private fields,然后再写访问它们的properties。

这实在不是人干的工作,应该交给机器来作。

在VS2005中,使用正则表达式进行查找、替换操作,就可以轻松完成属性的自动生成。如下图所示。









上图中的“查找内容”文本框中填写的是:(private|protected) {:i+} {_*}{:i+};
“替换为”文本框中填写的是:public \1 \3\n    {\n        get { return \2\3; }\n        set { \2\3 = value; }\n    }

一个难题

但是,如果公司的编码规范是下面这样的,该怎么办呢?

private int age;
public int Age
{
    get { return age; }
    set { age = value; }
}

这个问题难在,要求用查找、替换功能把“age”变成“Age”。仅仅使用查找、替换功能很难做到这点,因为在正则表达式的语法里既没有判断语句(连case...when都没有),也不能对匹配结果作任何的变换。

另类解决

解决这个问题的思路是,虽然不能直接对匹配结果进行变换,但是起码可以为下一步用其它方法进行变换的工作提供某种便利。
和上面的方法一样,仍然使用正则表达式进行查找、替换。只不过替换用的表达式要稍作修改。
“替换为”文本框中填写的内容改为:public \(-50,1) \3\n    {\n        get { return \2\3; }\n        set { \2\3 = value; }\n    }

这样进行替换之后的结果像这样:



接着,按下图所示的方法即可将属性的首字母变为大写的。



现在,已经可以进行编译了。如果你的领导嫌这个代码难看,就问他:“公司的编码规范可有规定属性前面的空格数量?”(呵呵,开玩笑的)
只要使用VS2005里贴心的代码格式化功能,就能把代码变漂亮了:





感谢兴百放的使用Vs.Net 的一些小技巧(不断更新中) 一文。

=======================================
 2007-11-28 更新
=======================================


刚刚试用了一款不错的文本编辑器EmEditor,它的查找替换功能里面支持大小写的转换,这样就不用像上面那么麻烦了。



“Replace with”文本框里面的那个“\U\3\E”表示要把“\U”和“\E”之间包裹的“\3”转换为大写字母。
完整的正则表达式如下:
Find:(private|protected) (\w+) _*([a-zA-Z])(\w+)+;
Replace with:public \2 \U\3\E\4\n{\n get { return \3\4; }\n set { \3\4 = value; }\n} 
 
posted on 2007-11-08 16:17 1-2-3 阅读(3103) 评论(48)  编辑 收藏 所属分类: 实用

FeedBack:
#1楼  2007-11-01 08:33 lovecherry      
我一般alt r,f
  回复  引用  查看    
#2楼  2007-11-01 08:37 henry      
VS2008已经帮我们自动化了....
Public int Age
{
get;
set;
}
  回复  引用  查看    
#3楼  2007-11-01 08:40 Cat Chen      
很有趣的hack,不过VS2008中的编译器已经能自动完成这样的工作了。只需要写public int Age { get; set; },就会自动生成私有字段保存其值。
  回复  引用  查看    
#4楼 [楼主] 2007-11-01 08:44 1-2-3      
@lovecherry
试了下,Alt r,f 也很好用。
  回复  引用  查看    
#5楼 [楼主] 2007-11-01 08:44 1-2-3      
@henry
@Cat Chen
VS真是越来越贴心了。
  回复  引用  查看    
#6楼  2007-11-01 08:45 寒枫天上      
Hehe,好文章,有启发性
  回复  引用  查看    
#7楼  2007-11-01 08:48 henry      
所以用VS2008写2.0应用程序方便了不少啊
  回复  引用  查看    
#8楼  2007-11-01 08:49 Enzo      
小技巧 好使用
  回复  引用  查看    
#9楼 [楼主] 2007-11-01 08:53 1-2-3      
@寒枫天上
刚刚看了您的博客,天哪,您是科学家么?俺对您的崇拜有如滔滔江水......
  回复  引用  查看    
#10楼  2007-11-01 09:07 想家的鱼      
夸张了吧,能把VS用成这样的,厉害哦~~~
  回复  引用  查看    
#11楼  2007-11-01 09:12 craboYang      
VS 2005, 输入prop , 按tab , 整个属性块自动生成了。
  回复  引用  查看    
#12楼  2007-11-01 09:15 暗香浮动      
05中已经有这个功能了
在私有字段上 右键 重构 封装字段。
  回复  引用  查看    
#13楼  2007-11-01 09:17 FoolTime [未注册用户]
右键点 private 字段,
重构-》封装字段
挺好用啊。
  回复  引用  查看    
#14楼 [楼主] 2007-11-01 09:22 1-2-3      
@暗香浮动
@FoolTime
但是似乎不能批量呀。
  回复  引用  查看    
#15楼  2007-11-01 10:08 zzz [未注册用户]
这个。。。。有必要这么麻烦吗,用codesmith写个模板再生成一下不就好了
  回复  引用  查看    
#16楼  2007-11-01 10:11 不错 [未注册用户]
呵呵,有点意思
  回复  引用  查看    
#17楼 [楼主] 2007-11-01 10:22 1-2-3      
@zzz
没错,用CodeSmith可以一键生成整个类的代码。所以这个主要适用于生成数据库无关的类属性。
  回复  引用  查看    
#18楼  2007-11-01 10:48 木野狐(Neil Chen)      
很 bt 的用法 :)
  回复  引用  查看    
#19楼  2007-11-01 11:03 丰色日月      
批量生成属性还是不错啊。特别是WEB页面中,用重构太慢了
  回复  引用  查看    
#20楼  2007-11-01 11:15 老刀把子      
有用,可以批量生成。
免得我一个一个地封装。
  回复  引用  查看    
#21楼  2007-11-01 11:18 老刀把子      
@暗香浮动
--引用--------------------------------------------------
暗香浮动: 05中已经有这个功能了
在私有字段上 右键 重构 封装字段。
--------------------------------------------------------
那样是不是每次只能封装一个?
我想批量好像不行?请指教。
  回复  引用  查看    
不错不错,新的思路,学习学习:)
  回复  引用  查看    
#23楼  2007-11-01 11:41 [阿毅] [未注册用户]
批量重构的时候,倒是挺好的。
如果一开始就知道要对这10个8个的private fields写访问它们的properties,那应该是一开始就用 code snippet 来编制,键入 prop 或 propg 再按个tab键,搞定,多轻松。
  回复  引用  查看    
#24楼  2007-11-01 12:32 Sleet [未注册用户]
--引用--------------------------------------------------
FoolTime: 右键点 private 字段,
重构-》封装字段
挺好用啊。
--------------------------------------------------------
你试试几十个私有字段
  回复  引用  查看    
#25楼  2007-11-01 12:48 Justin      
偷懒无罪,哈哈
  回复  引用  查看    
#26楼  2007-11-01 12:58 BenSoft [未注册用户]
--引用--------------------------------------------------
Sleet:
--------------------------------------------------------
你试试几十个私有字段
--------------------------------------------------------

自己可以修改code snippet定义嘛。
一般我们也会把一个项目中常用的代码片断定义好,按后分发给组员。
  回复  引用  查看    
#27楼  2007-11-01 12:59 Jack Niu      
学习啊!
  回复  引用  查看    
#28楼  2007-11-01 13:48 zoti      
我咋沒想到這個辦法呢,呵呵。
  回复  引用  查看    
#29楼  2007-11-01 16:11 暗香浮动      
这种正则不怎么看得懂
{:a}这个是分组么

\1 \2 \3
这个是对分组的引用么

  回复  引用  查看    
#30楼 [楼主] 2007-11-01 16:35 1-2-3      
@暗香浮动
{}是只能用在查找、替换对话框里的特殊语法,叫作“标记表达式”。


与分组的概念很形似,主要用途就是可以在“替换为”里面写“\1”就会输出第一个“{}”中匹配到的内容;“\2”就会输出第二个“{}”中匹配到的内容。在上图的菜单中点击“完整字符列表”可以看到一个详尽的帮助信息。


  回复  引用  查看    
#31楼  2007-11-01 23:44 Reeezak      
这些事情我还是习惯自己写一个macro……可以节约不少的时间,基本上都可以一次性编写成功,正则表达式很多时候自己都会写晕头的……^_^
  回复  引用  查看    
#32楼 [楼主] 2007-11-02 08:05 1-2-3      
@Reeezak
宏的话使用起来应该会更方便一些,不过感觉编写宏挺费劲的,不知您是否可以介绍介绍经验。
  回复  引用  查看    
#33楼  2007-11-02 10:57 暗香浮动      
@1-2-3
谢谢。
  回复  引用  查看    
好疯哦
  回复  引用  查看    
#35楼 [楼主] 2007-11-02 16:23 1-2-3      
@Victor.Woo
呵呵,所以我说了是有些恶搞的。
  回复  引用  查看    
好晕,真是恶搞,写一个代码生成器不就完了嘛,搞这么复杂,我在写这块儿的时候确实头痛了好久,不过现在不怕了,哈哈,偶输入n个单词,以逗号隔开,字段,属性就都出来了。然后^c,^v
  回复  引用  查看    
#37楼  2007-11-03 12:02 Anders Cui      
建议试试Property Manager add-in
  回复  引用  查看    
#38楼 [楼主] 2007-11-05 08:54 1-2-3      
@Anders Cui
非常感谢!
刚刚下了一个试用了一下,确实非常好用。推荐大家也试试,网址:http://www.csharper.net/blog/property_manager_update.aspx#property_manager_addin_for_visual_studio_2005.aspx



但是不知道为什么我试用的时候生成的属性没有自动换行。

  回复  引用  查看    
#39楼 [楼主] 2007-11-08 16:20 1-2-3      

修订记录:
以前“查找内容”文本框中填写的是:(private|protected) {:a+} {_*}{:a+};

今天发现:a只能匹配字母或数字,不匹配下划线,所以改成了
(private|protected) {:i+} {_*}{:i+};


  回复  引用  查看    
#40楼 [楼主] 2007-11-08 16:30 1-2-3      
to dudu 和园里的朋友:
我发现本文有一个错误,然后进行了些修改,然后不小心点了“存为草稿”按钮,接着又点了“发布草稿”发布,结果使得这篇随笔又跑到首页顶部了,实在不是有意的,抱歉抱歉。
  回复  引用  查看    
#41楼 [楼主] 2007-11-08 16:32 1-2-3      
对了,我要是不选发布到首页是不是就行了,试下。
  回复  引用  查看    
#42楼  2007-11-08 16:37 Mirricle      
按prop然后按TAB自动会出现property的code
改一点就能用 很方便
  回复  引用  查看    
#43楼  2007-11-12 14:01 兴百放      
楼主,连这个也能用正则表达式来完成,
真是强,学习学习
不过要是高手,能偷懒就偷懒
可是对于一般人来说,还是建议写一下,写得过程中体会体会属性
免得到时候忘了
  回复  引用  查看    
#44楼 [楼主] 2007-11-12 14:08 1-2-3      
@兴百放
也要感谢您的帖子呀。我正在琢磨新的偷懒方法,也许会再写一篇别的。
  回复  引用  查看    
#45楼 [楼主] 2007-11-28 15:07 1-2-3      
修订记录:
增加了使用EmEditor生成属性的方法。
  回复  引用  查看    
#46楼  2007-12-17 09:39 唐德兵      
我晕,你这个方法确实行,不过不是偷懒,而且想法。

明明vs就支持重构的功能,申明一个变量,可以自动生成对应的属性。
  回复  引用  查看    
#47楼 [楼主] 2008-01-16 15:16 1-2-3      
修订记录:
将EmEditor的Replace的表达式由
public \2 \U\3\L\4\n{\n get { return \3\4; }\n set { \3\4 = value; }\n}
改为
public \2 \U\3\E\4\n{\n get { return \3\4; }\n set { \3\4 = value; }\n}

  回复  引用  查看    
#48楼  2008-05-06 11:20 yongfa365 [未注册用户]
呵呵,正则表达式及Emeditor的受宜者,你说的这方法,我太长用了,尤其是在做一个网站时一个页面有40个textbox时,处理起来非常爽,

正则表达式已经是工作中不可缺少的技术了。整个思维高度从1升到了8848

建议没有学过正则的人快学了,还有Emeditor非常好用的辅助工具
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-16 15:13 编辑过
 
另存  打印
最新IT新闻:
· 微软高管:Wii用户最终会成为Xbox 360用户
· 遵守YouTube案裁定 谷歌将陷入隐私指控深渊
· iPhone入华在即 中国手机产业生存面临考验
· 阿里巴巴集团再向淘宝注资20亿元
· 56被关一月 危机的是整个视频业