分享
 
 
 

Regular Expressions (3) ---- Using Regex in .NET

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Regular Expressions (3) ---- Using Regex in .NET

看这篇文章之前,假定你已经了解了有关正则表达式的一些知识,并且知道如何去应用它。本篇文章只介绍如何在.NET中使用正则表达式。

最后是一个应用正则表达式的给VB程序语法加亮的小程序。

名称空间和相关的类

.NET中所有和正则表达式相关的类都定义在System.Text.RegularExpressions名称空间下。

分别是:

Class

Description

Regex

不可变的(只读)的正则表达式的实例,包括一些静态方法

Capture

包含单个子表达式匹配的结果,不能实例化,必须通过Group和Match来访问。

CaptureCollection

Capture的序列

Group

一组表达式匹配的结果,由Capture继承而来

GroupCollection

Group的序列

Match

一个正则表达式的匹配结果,由Group继承而来

MatchCollection

Match的序列

下面用图和例子说明各个类之间的关系:

例:

如上图:

匹配的字符串是:”xgraygreyxgreyxgray”

正则表达式是:(gr[ae])y

表示匹配”gray”或者”grey”一次或n次。

从生成的匹配树可以看到:

总共找到了三个匹配。每个匹配的值分别为:graygray,gray,grey。

以第一个匹配为例:

匹配一中共包括两个组:每个组的值分别为:graygrey,grey。

第一个组只有一个捕获结果,就是graygrey。

第二组有两个捕获结果,分别为gray和grey。

下面说明这些类的详细作用:

Match:

Match表示的是一个正则表达式的匹配操作。

如上例:

(Gr[ae]y)+得到三个Match结果。分别是graygrey,gray,grey。

这等于是正则表达式解释器把(gr[ae]y)+吃拆成了(gr[ae]y)+,(gray)+和(grey)+三个单独的子表达式。

每个子表达式对应一个Match结果。

Regex

Result

(gr[ae]y)+

Graygrey

(gray)+

Gray

(grey)+

Grey

MatchCollection

MatchCollection表示的就是所有的字表达式的Match结果的集合。

可以通过遍历Matchs的集合来访问各个子表达式的Match结果。

For each m as Match in Regex.Matches(“graygrey”, (gr[ae]y)+”)

‘ Use match result here.

Next

Group:

每个子表达式默认就是一个组。所以子表达式的所有组的结果都保存在第一个组中,这也是为什么每个Match的结果和第一个Group的结果是一样的,因为它们就是一个。

在.NET中,用括号括起来的子表达式表示这是一个组。

可以通过(?<groupName><子表达式>)来显示的给组命名。

比如:

Regex r = new Regex(“(?<g1>abc)+”)。就定义了一个组,名字为g1。

在程序中,我们可以通过组命来访问组的匹配结果。

Dim m As Match = r.Match("xxabcabc")

Dim g1 As Group = m.Groups(“g1”)

GroupCollection

GroupCollection表示一个Match中Group的集合。

可以通过组命或者索引来访问一个组。

Catpure:

Capture中保存的是每一个子表达式的最小匹配结果,它相当于是原子匹配,比如a匹配a,则结果a就保存在capture中,group的结果只是所的capture结果的组合。

所以如果一个匹配只有一个group,这个group中又只有一个capture,则这个capture的结果就是整个Match的结果。

CaptureCollection

Capture的序列。

VBHightDemo

下面介绍一下这个应用正则表达式给VB语法加亮的程序。

这个程序的原理就是根据正则表达式分析每一行字符串,根据匹配结果,把相应的字符的颜色改变。

关键的地方就是拿到组建的正则表达式。

Private VBImports As Regex = New Regex("(?<![\.\w])(imports)[^\w]", RegexOptions.Compiled)

Private QuotedString As Regex = New Regex("""" & "[^""]*" & """", RegexOptions.Compiled)

Private VBComment As Regex = New Regex("'.*")

Private EmptyLine As Regex = New Regex("^\\s*\\Z", RegexOptions.Compiled)

Private VBRegion As Regex = New Regex("(#region|#end region){1}", RegexOptions.Compiled)

'-- use lookbehind, keywords can not follow by a '.' or a characotr

Dim aa As String = "(?<![\.\w])(as|boolean|break|byte|byval|byref|" _

& "case|catch|char|checked|class|const|continue|" _

& "decimal|dim|default|delegate|double|else|" _

& "enum|end|event|exit|explicit|extern|false|each|" _

& "float|friend|for|goto|if|implicit|inherits|" _

& "integer|interface|internal|is|lock|long|" _

& "namespace|new|next|overrides|overloads|object|operator|out|" _

& "override|params|private|protected|" _

& "public|readonly|ref|return|sbyte|sealed|" _

& "short|static|string|sub|" _

& "structure|switch|me|mybase|throw|true|try|typeof|" _

& "uint|ulong|unchecked|ushort|using|" _

& "while|withevents){1}[^\w]"

Private VBKeyWords As Regex = New Regex(aa, RegexOptions.Compiled)

Private SystemKeyWords As Regex = New Regex("(application|console|environment|gc|threadpool|math){1}", RegexOptions.Compiled)

Private

Brackets As Regex = New Regex("(\{|\[|\(|\}|\]|\))", RegexOptions.Compiled)

在匹配的时候,可以给指定匹配的选项,比如忽略大小写,单行还是多行等等。

然后遍历并加亮匹配的结果就可以了。

For Each m As Match In regex.Matches(s)

Me.ColorString(start + m.Groups(0).Index, m.Groups(0).Length, color)

Next

因为组中保存的就是所有capture的组合的结果,所以只加亮groups(0)中的字符串就够了,不需要再重复处理group中captures的值。

不正之处还请多多指正。

:)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有