>>51aspx首页 | >>Winform源码 | >>.Net源码大搜捕 | >>问题/帮助

Asp.net源码交流论坛

登录 注册
  • 标签
  • 会员
  • 搜索
  • 帮助

Asp.net源码交流论坛 » Asp.net交流讨论区 » Asp.net技术文章 » C#中的正则表达式(1)

帖子标题
业务申请区
  • 实名认证申请
  • 免费.Net主机申请
  • 积分奖励申请
  • 有偿服务申请
Asp.net交流讨论区
  • Asp.net技术问答
  • .Net项目、服务交易区
  • .Net源码问答区
  • Asp.net技术文章
  • 常用工具下载
Asp.net资源发布区
  • [源码发布区]
  • [视频发布区]
  • [商业代码区]
  • [其他.net相关资源]
Asp.net专题讨论区
  • Ajax/Atlas无刷新技术
  • 面向对象开发
  • ADO.net讨论区
  • 控件专题讨论
源码环境搭建和部署视频! 源码使用常见问题 51Aspx自有服务产品 开业特惠 快速通道:[源码发布] | [实名认证]
1/2页12 跳转到页查看:7550
发新话题 回复该主题
键盘左右键可以进行前后翻页操作
帮助

C#中的正则表达式(1)

本主题由 董事长 51aspx 于 2009-7-23 21:35:51 执行 设置精华/取消 操作
离线 凉风入夜
头像

  • [程序员]
  • [65]
  • 23
  • 2009-06-09
凉风入夜 2009-07-23 17:48 | 只看楼主 树型| 收藏| 小 中 大 1 #

C#中的正则表达式(1)



摘要:本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符、规则、选项等。
  
  关键字:正则表达式、元字符、字符串、匹配
  
  1、正则表达式简介
  
  正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如 HTML处理、日志文件分析和 HTTP 标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。
  
  .NET 框架正则表达式并入了其他正则表达式实现的最常见功能,被设计为与 Perl 5 正则表达式兼容,.NET 框架正则表达式还包括一些在其他实现中尚未提供的功能,.NET 框架正则表达式类是基类库的一部分,并且可以和面向公共语言运行库的任何语言或工具一起使用。
  
  2、字符串搜索
  
  正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。正是元字符组为正则表达式提供了处理能力。当前,所有的文本编辑器都有一些搜索功能,通常可以打开一个对话框,在其中的一个文本框中键入要定位的字符串,如果还要同时进行替换操作,可以键入一个替换字符串,比如在Windows操作系统中的记事本、Office系列中的文档编辑器都有这种功能。这种搜索最简单的方式,这类问题很容易用String类的String.Replace()方法来解决,但如果需要在文档中识别某个重复的,该怎么办?编写一个例程,从一个String类中选择重复的字是比较复杂的,此时使用语言就很适合。
  
  一般表达式语言是一种可以编写搜索表达式的语言。在该语言中,可以把文档中要搜索的文本、转义序列和特定含义的其他字符组合在一起,例如序列\b表示一个字的开头和结尾(子的边界),如果要表示正在查找的以字符th开头的字,就可以编写一般表达式\bth(即序列字符界是-t-h)。如果要搜索所有以th结尾的字,就可以编写th\b(序列t-h-字边界)。但是,一般表达式要比这复杂得多,例如,可以在搜索操作中找到存储部分文本的工具性程序(facility)。
  3、.NET 框架的正则表达式类
  
  下面通过介绍 .NET 框架的正则表达式类,熟悉一下.NET框架下的正则表达式的使用方法。
  
  3.1 Regex 类表示只读正则表达式
  
  Regex 类包含各种静态方法,允许在不显式实例化其他类的对象的情况下使用其他正则表达式类。以下代码示例创建了 Regex 类的实例并在初始化对象时定义一个简单的正则表达式。请注意,使用了附加的反斜杠作为转义字符,它将 \s 匹配字符类中的反斜杠指定为原义字符。
  
    
  
  Regex r; // 声明一个 Regex类的变量
  
  r = new Regex("\\s2000"); // 定义表达式
  
  3.2 Match 类表示正则表达式匹配操作的结果
  
  以下示例使用 Regex 类的 Match 方法返回 Match 类型的对象,以便找到输入字符串中第一个匹配。此示例使用 Match 类的 Match.Success 属性来指示是否已找到匹配。
  
    
  
  Regex r = new Regex("abc"); // 定义一个Regex对象实例
  
  Match m = r.Match("123abc456"); // 在字符串中匹配
  
  if (m.Success)
  
  {
  
  Console.WriteLine("Found match at position " + m.Index); //输入匹配字符的位置
  
  }
  
  3.3 MatchCollection 类表示非重叠匹配的序列
  
  该集合为只读的,并且没有公共构造函数。MatchCollection 的实例是由 Regex.Matches 属性返回的。使用 Regex 类的 Matches 方法,通过在输入字符串中找到的所有匹配填充 MatchCollection。下面代码示例演示了如何将集合复制到一个字符串数组(保留每一匹配)和一个整数数组(指示每一匹配的位置)中。
  
    
  
  MatchCollection mc;
  
  String[] results = new String[20];
  
  int[] matchposition = new int[20];
  
  Regex r = new Regex("abc"); //定义一个Regex对象实例
  
  mc = r.Matches("123abc4abcd");
  
  for (int i = 0; i < mc.Count; i++) //在输入字符串中找到所有匹配
  
  {
  
  results = mc.Value; //将匹配的字符串添在字符串数组中
  
  matchposition = mc.Index; //记录匹配字符的位置
  
  }
  
  3.4 GroupCollection 类表示捕获的组的集合
  
  该集合为只读的,并且没有公共构造函数。GroupCollection 的实例在 Match.Groups 属性返回的集合中返回。下面的控制台应用程序查找并输出由正则表达式捕获的组的数目。
  
    
  
  using System;
  
  using System.Text.RegularExpressions;
  
  public class RegexTest
  
  {
  
  public static void RunTest()
  
  {
  
  Regex r = new Regex("(a(b))c"); //定义组
  
  Match m = r.Match("abdabc");
  
  Console.WriteLine("Number of groups found = " + m.Groups.Count);
  
  }
  
  public static void Main()
  
  {
  
  RunTest();
  
  }
  
  }
  
  该示例产生下面的输出:
  
    
  
  Number of groups found = 3
  
  3.5 CaptureCollection 类表示捕获的子字符串的序列
  
  由于限定符,捕获组可以在单个匹配中捕获多个字符串。Captures属性(CaptureCollection 类的对象)是作为 Match 和 group 类的成员提供的,以便于对捕获的子字符串的集合的访问。例如,如果使用正则表达式 ((a(b))c)+(其中 + 限定符指定一个或多个匹配)从字符串"abcabcabc"中捕获匹配,则子字符串的每一匹配的 Group 的 CaptureCollection 将包含三个成员。
  
  下面的程序使用正则表达式 (Abc)+来查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一个或多个匹配,阐释了使用 Captures 属性来返回多组捕获的子字符串。
  
    
  
  using System;
  
  using System.Text.RegularExpressions;
  
  public class RegexTest
  
  {
  
  public static void RunTest()
  
  {
  
  int counter;
  
  Match m;
  
  CaptureCollection cc;
  
  GroupCollection gc;
  
  Regex r = new Regex("(Abc)+"); //查找"Abc"
  
  m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //设定要查找的字符串
  
  gc = m.Groups;
  
  //输出查找组的数目
  
  Console.WriteLine("Captured groups = " + gc.Count.ToString());
  
  // Loop through each group.
  
  for (int i=0; i < gc.Count; i++) //查找每一个组
  
  {
  
  cc = gc.Captures;
  
  counter = cc.Count;
  
  Console.WriteLine("Captures count = " + counter.ToString());
  
  for (int ii = 0; ii < counter; ii++)
  
  {
  
  // Print capture and position.
  
  Console.WriteLine(cc[ii] + " Starts at character " +
  
  cc[ii].Index); //输入捕获位置
  
  }
  
  }
  
  }
  
  public static void Main() {
  
  RunTest();
  
  }
  
  }
  
  此例返回下面的输出结果:
  
    
  
  Captured groups = 2
  
  Captures count = 1
  
  AbcAbcAbc Starts at character 3
  
  Captures count = 3
  
  Abc Starts at character 3
  
  Abc Starts at character 6
  
  Abc Starts at character 9
  
  3.6 Capture 类包含来自单个子表达式捕获的结果
  
  在 Group 集合中循环,从 Group 的每一成员中提取 Capture 集合,并且将变量 posn 和 length 分别分配给找到每一字符串的初始字符串中的字符位置,以及每一字符串的长度。
  
    
  
  Regex r;
  
  Match m;
  
  CaptureCollection cc;
  
  int posn, length;
  
  r = new Regex("(abc)*");
  
  m = r.Match("bcabcabc");
  
  for (int i=0; m.Groups.Value != ""; i++)
  
  {
  
  cc = m.Groups.Captures;
  
  for (int j = 0; j < cc.Count; j++)
  
  {
  
  posn = cc[j].Index; //捕获对象位置
  
  length = cc[j].Length; //捕获对象长度
  
  }
  
  }
    
    
  
  
    
  
  
  把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。如果希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,可以用以字符序列"?:"开头的组禁止这么做,就像URI样例那样。而对于所有的组,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 58854
  • 1
  • 37 分
  • 4 元
  • 离线
离线 gwins
头像

  • [学员]
  • [7]
  • 6
  • 2008-03-23
gwins 2009-08-04 12:55 树型| 收藏| 小 中 大 2 #

学习...



 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 10863
  • 0
  • 1 分
  • -0.65 元
  • 离线
离线 炮炮
头像

  • [实习生]
  • [13]
  • 4
  • 2009-08-05
炮炮 2009-08-05 10:10 树型| 收藏| 小 中 大 3 #



温习一下~~~继续贴呀
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 64280
  • 0
  • 9 分
  • 2 元
  • 离线
离线 gslei
头像

憨憨slei

  • [程序员]
  • [55]
  • 25
  • 2009-08-20
gslei 2009-08-20 10:27 树型| 收藏| 小 中 大 4 #



最好 打包下 这样看着不爽
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 65475
  • 0
  • 30 分
  • 3 元
  • 北京
  • 离线
  • MSN Messenger: gao_lu_yi@live.cn gao_lu_yi@live.cn
  • QQ: 81318871 81318871
离线 fristreet
头像

  • [实习生]
  • [13]
  • 4
  • 2009-08-10
fristreet 2009-08-27 14:15 树型| 收藏| 小 中 大 5 #



大学课程害死人啊,这些根本不提~~
Console.WriteLine("努力学习,活学活用!");
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 64660
  • 0
  • 9 分
  • 3 元
  • 离线
离线 s207ping
头像

北京网站建设

  • [版主]
  • [474]
  • 299
  • 2007-10-15
实名用户
s207ping 2009-08-27 15:23 树型| 收藏| 小 中 大 6 #

[实名用户所发信息,推荐关注实名贴,值得关注]


理论的东西,面试有用
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 1243
  • 3
  • 160 分
  • 28.55 元
  • 北京
  • 离线
  • QQ: 172619185 172619185
离线 kl098765
头像

  • [实习生]
  • [20]
  • 6
  • 2009-05-05
kl098765 2009-08-31 14:34 树型| 收藏| 小 中 大 7 #



记号
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 55458
  • 0
  • 14 分
  • 4 元
  • 离线
离线 welovesong
头像

  • [学员]
  • [2]
  • 0
  • 2009-10-01
welovesong 2009-10-03 11:30 树型| 收藏| 小 中 大 8 #



好帖。DINGING..
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 69039
  • 0
  • 2 分
  • 1 元
  • 离线
离线 dldcl
头像

  • [实习生]
  • 1987-7-11
  • [23]
  • 9
  • 2009-10-26
dldcl 2009-10-27 09:52 树型| 收藏| 小 中 大 9 #



好帖
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 70806
  • 0
  • 14 分
  • 1 元
  • 河南
  • 离线
  • QQ: 996469527 996469527
离线 543150912
头像

我爱asp

  • [学员]
  • 1990-1-5
  • [5]
  • 2
  • 2009-10-27
543150912 2009-10-27 22:24 树型| 收藏| 小 中 大 10 #



好贴 我顶
 

TOP

 

发送短消息

查看公共资料

查找该会员全部帖子

  • 70981
  • 0
  • 3 分
  • 0 元
  • 湖北
  • 离线
  • ICQ: 543150912 543150912
<<上一主题|下一主题>>
1/2页12 跳转到页
发表新主题 回复该主题
  • 发新主题

Asp.net源码下载专业站  - 源码推荐 - 最新源码  Sitemap

bbs.51Aspx.com - 简洁版本 - TOP - 界面风格

  • Default

Discuz!NT

Powered by Discuz!NT 2.6.1 © 2000-2010 51Aspx.com.

Processed in 0.3125 second(s) , 5 queries. 京ICP备06046876号

  • 我的资料
  • 我的主题
  • 我的回复
  • 我的精华
  • 我的附件
  • 我的收藏
  • 基本状况
  • 流量统计
  • 客户软件
  • 发帖量记录
  • 版块排行
  • 主题排行
  • 发帖排行
  • 积分排行
  • 在线时间
帖子标题
作  者