审查征集贴:http://www.cnblogs.com/BeginnerClassroom/archive/2010/07/30/1788649.html

附录征集贴:http://www.cnblogs.com/BeginnerClassroom/archive/2010/08/04/1792175.html

欢迎各位园友对本书的某一部分内容进行拓展,将以附录的形式附在书后。

要求:

  1. 紧紧围绕一两个中心展开;
  2. 逻辑清晰,行文流畅;
  3. 考虑到初学者的基础。
  4. 写作时间最好不要少于一星期。

我写东西都是写好以后先放在那里,过段时间再读,重新修改,如此反复几次,就基本上很流畅了。

 

(PS:会署名,但无稿费,因为本来就没多少,不够分的。当然如果发了大财,我会分给大家的。)

标题 作者 状态
关于RichTextBox修改字体大小的研究 李雨来 已完稿
委托和接口的区别 汤非凡 正在写
XML格式注释 Capricornus 正在写
接口的显式实现以及与抽象类的比较 顾磊 正在写
     
     
.NET版本变更表 张智鸣 正在写
字符编码 赵士敬 正在写
     
浅谈流的读取 黄志斌 正在写
正则表达式在EmEditor里的应用 柳永法 正在写
绘图缓存   待选
     

 

正则表达式应用实例

(本文柳永法由提供)

正则表达式表面看起来很复杂,其实很简单,它的核心就是一种思想——匹配。替换、遍历只是它的附加功能。我自从接触正则表达式后,感觉思维一下子开阔很多,很多操作不由自主地会想到用正则表达式来实现。

实际应用中,我经常用到的正则表达式其实并不多,比如\w、\W、\s、\S、\ D、\ d、+、*、?、[]、{n,m}等,基本上就能满足我的大部分需求。大多数人只把正则用在JS、VBS,.NET里,其实正则表达式的应用范围远不止这些,比如很多文本编辑器对正则的支持就非常好,你可以不用写程序就能很方便的把它应用到日常开发与写作里。以下是我在EmEditor里的一些应用实例,供初学者参考。

clip_image002

图1 EmEditor的界面

例1. 根据Name及URL生成超链接

原始文本:

博客园 http://www.cnblogs.com/

柳永法 http://www.yongfa365.com/

谷歌 http://www.google.cn/

正则表达式:

(\S+)\s+(\S+)

替换为:

<a href="\2">\1</a>

结果:

<a href="http://www.cnblogs.com/">cnblogs</a>

<a href="http://www.yongfa365.com/">柳永法</a>

<a href="http://www.google.cn/">谷歌</a>

说明:因为正则表达式 (\S+)\s+(\S+)有两个括号,所以它有两个分组,第一个分组匹配Name,第二个分组匹配URL。替换表达式里的\1对应第一个分组匹配到的Name(如“博客园”),\2对应第二个分组匹配的URL(如“http://www.cnblogs.com/”),这样就得到了我们想要的结果[①]

例2. 生成表单

原始文本:

用户名 UserName

密码 UserPassword

正则表达式:

(\S+)\s+(\S+)

替换为:

<td>\1:</td><td><input name="txt\2" /></td>

结果:

<td>用户名:</td><td><input name="txtUserName" /></td>

<td>密码:</td><td><input name="txtUserPassword" /></td>

说明:此例和例1非常相似,\1对应第一个分组(如“用户名”),\2对应第二个分组(如“UserName”)。

例3. 生成SQL语句

原始文本:

123

234

345

正则表达式:

(\d+)

替换为:

insert into Card(Code,AddTime) values ('\1',getdate())

替换结果:

insert into Card(Code,AddTime) values ('123',getdate())

insert into Card(Code,AddTime) values ('234',getdate())

insert into Card(Code,AddTime) values ('345',getdate())

说明:正则表达式 (\d+)匹配每条数据,与替换表达式里的\1对应。

例4. 生成类的内部代码

原始文本:

用户名 UserName

密码 UserPassword

正则表达式:

(\S+)\s+(\S+)

替换为:

string _\2;\n/// <summary>\n/// \1\n/// </summary>\npublic string \2\n{\n get { return _\2; }\n set { _\2 = value; }\n}

结果:

string _UserName;

/// <summary>

/// 用户名

/// </summary>

public string UserName

{

get { return _UserName; }

set { _UserName = value; }

}

string _UserPassword;

/// <summary>

/// 密码

/// </summary>

public string UserPassword

{

get { return _UserPassword; }

set { _UserPassword = value; }

}

说明:虽然看起来很复杂,其实它的原理和前面是一样的。仔细观察就会发现里面也有后向引用符\1和\2,只不过替换表达式里的文本长一点,并且多了个换行符\n而已。

以上用到的正则表达式是不是很少,但却很实用呢?特别是数据在十几行,几十行时的情况下。写正则表达式要注意观察原始文本的特征,很多情况下,我们并不需要写出很完整的正则表达式,够用即可。比如在例1中,正则表达式(\S+)\s+(\S+)中的第二个(\S+)匹配URL,在这种文本环境下只要一个(\S+)就可以了,不需要写出一堆完整的正则表达式去匹配URL。

这里仅起一个抛砖引玉的作用,我就是想通过它说明,正则表达式不仅仅是一种技术,更是一种“思维模式”,它会在你一次次使用后升华为思想的一部分。

柳永法

2010.8.8

http://www.yongfa365.com/


[①] 关于正则表达式的基本语法,请参看第20章。