作者:jack H Hansen 出处:csdn
想必很多读者都写过给程序代码按语法着色的程序。而这在一段时间以前是一件很困难的事。你需要写大量代码分析语法——而这往往又是最困难的部分。直到,正则表达式(Regular Expression)的出现,我们才可以从繁重的工作中解脱。正则表达式提供了一系列方法(标准、模式),使我们能够高效地创建、比较和修改字符串,以及迅速地分析大量文本和数据以搜索、移除和替换文本模式 。DotNET Framework 提供了 System.Text.RegularExpression 命名空间来实现他们承诺的功能。
1. 正则表达式
首先,我想先简单介绍一下正则表达式。
正则表达式最早是由数学家stephen Kleene于1956年提出,他是在对自然语言的递增研究成果的基础上提出来的。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。
正则表达式并非一门专用语言,但它可用于在一个文件或字符里查找和替代文本的一种标准。它具有两种标准:基本正则表达式(bre),扩展正则表达式(ere)。ere包括bre功能和另外其它的概念。
先进已有xsh,egrep,sed,vi以及在unix平台下的程序实现了正则表达式。它们可以被很多语言采纳,如html 和XML,这些采纳通常只是整个标准的一个子集。随着正则表达式移植到交叉平台的程序语言的发展,它的功能也日益完整,使用也逐渐广泛。
2. 相关的表达式
有关正则表达式我只能说这么多了——它是一个不小的知识体系,不可能用只言片语就解释清楚。这里我只介绍与c#语法分析相关的结个匹配串。详细内容请参见本blog站的收藏 Regular Expression Specification [ The Open Group ] 。 另外,如果你已经对正则表达式有了相当的了解,那你可以略过下面每一条的解释,以尽快完成全文。
i> 字符串 "(\\?.)*?"
正则表达式中除 . $ ^ { [ ( | ) * + ? \ 外,其他字符与自身匹配。在上面的式子中,两边的quotation mark就是指匹配字符串两边的引号。“\\”表示一个“\”字符。后面紧跟的“?”表示匹配零个或一个字符。“.” 与除 \n 之外的任何字符匹配。
“()”表示捕获匹配的子字符串。使用 () 的捕获根据左括号的顺序从1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。括号后面的“*”表示存在一个或多个这样的子字符串。即“*”是作用于“(\\?.)”的。
“?”的存在使空字符串也可以被捕获。
ii> 逐字字符串 @"(""|.)*?"
匹配类似于 @"Hello ""World ""!" 的字符串。
与用 | (垂直条)字符分隔的任何一个术语匹配;例如, cat|dog|tiger 。使用最左侧的成功匹配。
iii> C# 文档信息中的xml元素 ///\s*<.*>
匹配c#自动化xml文档。“\s”表示任何空白字符。需要注意的是,请不要随意修改大小写。因为在正则表达式是大小写敏感的,在它的通配符中,大小写字符往往表示完全相反的意思。比如,“\s”表示任何非空白字符。(下面的 “\Z”也是这样)
iv> C# 文档信息中的内容 ///\s?.*
v> 空行 ^\s*\Z
“^”指定匹配必须出现在字符串的开头或行的开头。而“\z”表示指定匹配必须出现在字符串的结尾或字符串结尾的 \n 之前。
vi> C# 注释 //.*
vii> C# 关键字 (abstract|where|while|yield){1}(\.|(\s)+|;|,|\(|\[){1}
篇幅所限,这儿只列出了很少几个关键字(c#有至少80个关键字 ^_^)。需要注意的是,解析器会匹配左边第一个成功项。因此,具有包含关系的单词应注意顺序:包含者要放在被包含者之前。例如:(in|int) 解析其会查不到 int,所以应该是 (int|in)。
除此之外还