首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> Perl教程
用正则表达式解析C#文件(updated)-.NET教程,C#语言
作者:网友供稿 点击:205
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
想必很多读者都写过给程序代码按语法着色的程序。而这在一段时间以前是一件很困难的事。你需要写大量代码分析语法——而这往往又是最困难的部分。直到,正则表达式(regular expression)的出现,我们才可以从繁重的工作中解脱。正则表达式提供了一系列方法(标准、模式),使我们能够高效地创建、比较和修改字符串,以及迅速地分析大量文本和数据以搜索、移除和替换文本模式 [1] 。dotnet framework 提供了 system.text.regularexpression 命名空间来实现他们承诺的功能。
1. 正则表达式 [2]

首先,我想先简单介绍一下正则表达式。

正则表达式最早是由数学家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)。

除此之外还有,所有的括号 (\{|\[|\(|\}|\]|\)) 。


3. 相关类与其成员 [3]

[serializable]

public class regex : iserializable

// 表示不可变的正则表达式。



regex 类包含若干静态方法,使您无需显式创建 regex 对象即可使用正则表达式。使用静态方法等效于构造 regex 对象,使用该对象一次然后将其销毁。

regex 类是不可变(只读)的,并且具有固有的线程安全性。可以在任何线程上创建 regex 对象,并在线程间共享。

以上摘自微软的开发文档。我们还需要用到它的几个成员:

// 在指定的输入字符串中搜索 regex 构造函数中指定的正则表达式匹配项。

public match match(

string intput

)


对于 match 类

[serializable]

public class match : group

// 表示单个正则表达式匹配的结果。有关 group 的详细信息请参见微软开发文档。


我们会用到它的下列成员

// 原始字符串中发现捕获的子字符串的从零开始的起始位置。

public int index { get; }



// 捕获的子字符串的长度。

public int length { get; }



// 通过匹配捕获的实际子字符串。

public int value { get; }



// 获取一个值,该值指示匹配是否成功。

public bool success { get; }



// 获取由正则表达式匹配的组的集合。

public virtual groupcollection groups { get; }



// 从上一个匹配结束的位置(即在上一个匹配字符之后的字符)开始

// 返回一个包含下一个匹配结果的新 match。

public match nextmatch();


以及 group 类的相应成员(上面列出的 match 的成员中,前四个属性都是由 group 类继承而来,因此这些成员将不再一一列出)。

匹配字符串必须在 regex 类的实例初始化的时候指定。你可以使用构造函数创建一个实例,使用它,然后销毁它。或者直接使用静态方法,这等效于创建实例。不过,经过测试,我发现静态方法要稍稍慢于编译的 regex 对象。请看下面的一组测试数据:




4. 撰写代码

我们现在需要对第三节中列出的c#语言元素进行分析。我所采取的是逐行分析(如果要采取多行分析,则相关表达式需要进行修改 [4] )。

using system.text.regularexpression;

// some other codes ... ...

// 首先创建 regex 实例(以字符串的解析为例)。

regex doublequotedstring = new regex( "\"(\\\\?.)*?\"" );

// 然后去匹配字符串。

match m;

for( m = doublequotedstring.match( strsomecodes ) ; m.success ; m.nextmatch() ) {

foreach( group g in m.groups ) {

// do some drawings

}

}


剩下的事就是写着色代码了。

5. 源代码





注:

[1] "能够……文本模式" 引自 .net framework 常规参考 中的 正则表达式语言元素

[2] 正则表达式简介 此处有关正则表达式的简介参考自 zdnet china 技术与开发 中的相关内容。

[3] 本节中出现的类与函数的签名与注释均出自微软文档。

[4] 多行分析 详情请参见 .net framework 常规参考 正则表达式语言元素



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·无刷新聊天室(短信陪聊程序)-ASP教程,ASP应用
·C#中使用Excel-.NET教程,C#语言
·简要JAVA数据类型转换-JSP教程,Java技巧及代码
·Recordset对象方法详解-ASP教程,ASP应用
·选用和配置ups时应注意的几个问题
·新型无源元件的现状与发展
·用正则表达式解析C#文件(updated)-.NET教程,C#语言
·正则表达式大全-ASP教程,ASP应用
·VB与ActiveX控件签名谈-.NET教程,VB.Net语言
·IIS6 和Tomcat5 的整合-ASP教程,ASP应用
最新文章
·网上能免费赚钱?想要网上创业吗?_网赚技巧
·孙中伟:聚合文学网站资源的功能_站长访谈
·网站最令人讨厌的用户体验_站长心得
·设计理论:谈用户体验,别落下商业利益_站长心得
·经营个人网站需要脚踏实地_站长心得
·google adwords关键词广告须注意的7个问题_google推广
·网站提交google注册应注意的问题_google推广
·伦敦mecompany网站设计师谈网页布局艺术2_站长心得
·搜索引擎不收录页面的常见原因_seo网站优化
·搜索引擎注册九大秘法_站长心得
相关主题
  • 用正则表达式来校验数据的合法性-ASP教程,正则表达式
  • 用正则表达式过滤脚本的一些研究(asp.net + C#)-.NET教程,C#语言
  • 用正则表达式得到网页上的链接-.NET教程,评论及其它
  • 用正则表达式解析C#文件(updated)-.NET教程,C#语言
  • 用正则表达式剔除文本中的HTML标记-ASP教程,正则表达式
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭