C#正则表达式类Match和Group类的理解
[
2009-4-23 14:45:17
| 作者: 一线风
| 阅读:814
| 评论:0
| 天气:
| 心情: normal
]
| 心情: normal
]
正则表达式可以看做一种有特定功能的小型编程语言,在一段文本中定位子字符串。利用正则表达式可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合。正则表达式的基本语法可参见:深入浅出之正则表达式(一),深入浅出之正则表达式(二)。
C#命名空间System.Text.RegularExpressions提供了支持正则表达式操作的类。这些类主要包括Regex,MatchCollection,Match,GroupCollection,Group,CaputerCollection和Caputer,下图表示了这些类之间的关系。

正则表达式很重要的一个应用就是在文本中提取字符串,这一功能的实现主要是靠Match类和Group类,因此理解匹配和组的概念很重要。要实现在一段文本中查找URL功能,这个例子比较简单,只要调用Regex.Matches()方法就可以找到URL的集合。示例代码如下:
文本中提取URL的C#代码
- public static void Main(string[]args)
- {
- stringtext="I'vefoundthisamazingURLathttp://www.sohu.com,andthenfindftp://ftp.sohu.comisbetter.";
- stringpattern=@"b(S+)://(S+)b"; //匹配URL的模式
- MatchCollectionmc=Regex.Matches(text,pattern);//满足pattern的匹配集合
- Console.WriteLine("文本中包含的URL地址有:");
- foreach(Matchmatchinmc)
- {
- Console.WriteLine(match.ToString());
- }
- Console.Read();
- }
- /*
- *运行后输出如下:
- *文本中包含的URL地址有:
- *http://www.sohu.com
- *ftp://ftp.sohu.com
- */
现在,要求变了,不仅要找出URL,还要找出每个URL的协议和域名地址,这时就要用到正则表达式的分组功能了。分组是要匹配的模式pattern用小括号括起来,分成不同的组,如可以把上面例子中的模式改为:string pattern = @"b(?<protocol>S+)://(?<address>S+)b";这样就用括号分成了两个组(实际上是三个组,因为匹配本身可以看做一个大组),"?<protocol>"和"?<address>"定义了每个组的别名protocol和address,这不是必须的,只是方便我们获取需要的组。示例代码如下:
提取URL协议和地址的示例C#代码
- public static void Main(string[]args)
- {
- stringtext="I'vefoundthisamazingURLathttp://www.sohu.com,andthenfindftp://ftp.sohu.comisbetter.";
- stringpattern=@"b(?<protocol>S+)://(?<address>S+)b";//匹配URL的模式,并分组
- MatchCollectionmc=Regex.Matches(text,pattern);//满足pattern的匹配集合
- Console.WriteLine("文本中包含的URL地址有:");
- foreach(Matchmatchinmc)
- {
- GroupCollectiongc=match.Groups;
- stringoutputText="URL:"+match.Value+";Protocol:"+gc["protocol"].Value+";Address:"+gc["address"].Value;
- Console.WriteLine(outputText);
- }
- Console.Read();
- }
- /**
- *运行后输出如下:
- *文本中包含的URL地址有:
- *URL:http://www.sohu.com;Protocol:http;Address:www.sohu.com
- *URL:ftp://ftp.sohu.com;Protocol:ftp;Address:ftp.sohu.com
- */
相关文章:
- 延时至调用时获取被反序列化数据的类型的实现 [2010年4月7日 15:43]
- 更改配置app.Config里的值 [2009年11月17日 17:53]
- 使用Oracle提供的Oracle.DataAccess 返回包里的记录集游标,含Oralce里的分页包代码 [2009年11月4日 17:41]
- 胖子大亨外挂,写了玩的.暂没打算发行~ [2009年7月21日 11:20]
- 微软:C#和CLI将执行“社区许可”授权 [2009年7月8日 14:41]
- 在C#中解析JavaScript代码 [2009年7月8日 9:54]
- 关于枚举类型转换的效率测试 [2009年6月25日 13:54]
- C#语言的几个层次 [2009年5月15日 13:02]
- 正则表达式--C#分组构造 [2009年4月24日 13:16]
- 子类与父类的小关系:盒子套盒子 [2009年3月10日 16:39]
- 泛型方法(C# 编程指南) [2009年3月6日 16:29]
- 动态类帮助器 [2009年2月20日 14:43]
订阅地址
