2008-03-04

关于正则表达式的简介

  早在高二的时候,我和我的朋友就在编写一个项目的时候用到了正则表达式匹配来管理服务器内的文件和编辑它们,可惜一直没有机会去看一看一些正则表达式的介绍,正巧这次在微软的VBScript手册中看到了一份,稍微整理了其中一些不错的介绍帖在这里。

早期起源
  正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
  1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。
  随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。
  如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。


使用正则表达式


  在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。
  使用正则表达式,就可以:



  • 测试字符串的某个模式:例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。

  • 替换文本:可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。

  • 根据模式匹配从字符串中提取一个子字符串:可以用来在文本或输入字段中查找特定文字。

  例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。


支持正则表达式的语言

  Ruby,Perl,Python,C#,Java,VB.NET等都支持正则表达式,C++需要第三方类库才能支持。

  目前,著名的并且很强悍的库有ATL CATLRegExp,GRETA和boost库。在VS2005中可以直接使用 System.Text.RegularExpressions命名空间的 Regex 类分析简单的字符串,参见:http://msdn2.microsoft.com/zh-cn/library/a9z6549f.aspx

其他三个库的使用方法可参考:

http://www.vckbase.com/document/viewdoc/?id=1138

http://www.vckbase.com/document/viewdoc/?id=1256

另外这里还有一个例子:

http://www.vckbase.com/document/viewdoc/?id=1636


正则表达式语法


  一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
下表是元字符及其在正则表达式上下文中的行为的一个完整列表(我的Blogger发布表格会严重的错误,所以只能用图片,点击打开图片可以看大图):


优先权顺序
在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先权顺序来求值。
下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序:

操作符           描述
\              转义符
(), (?:), (?=), []        圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}    限定符
^, $, \anymetacharacter   位置和顺序
             “或”操作

--------------------------
使用正则表达式:

可以参考http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm这个链接的内容。本文不讨论用法。

没有评论: