• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#中利用正则表达式实现字符串搜索(转)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

摘要:本文给出了在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[i] = mc[i].Value; //将匹配的字符串添在字符串数组中  matchposition[i] = mc[i].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++) //查找每一个组   {    


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换发布时间:2022-07-10
下一篇:
C#调用存储过程带输出参数或返回值发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap