手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

c#利用正则表达式实现字符串搜索_c#应用

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  

  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[i].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[i].Value != ""; i )

  {

   cc = m.Groups[i].Captures;

   for (int j = 0; j < cc.Count; j )

   {

    posn = cc[j].Index; //捕获对象位置

    length = cc[j].Length; //捕获对象长度

   }

}
  
  


  


  把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。假如希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,能够用以字符序列"?:"开头的组禁止这么做,就像URI样例那样。而对于任何的组,能够在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。

4、利用正则表达式实现字符串搜索

  4.1 在C#中使用.NET一般表达式引擎

  下面将通过一个样例的研发,执行并显示一些搜索的结果,说明一般表达式的一些特性,连同如何在C#中使用.NET一般表达式引擎。说明使用字符串时应在前面加上符号@。

  

  String Text=@"I can not find my position in Beijing";

  把这个文本称为输入字符串,为了说明一般表达式.NET类,本文先进行一次纯文本的搜索,这次搜索不带任何转义序列或一般表达式命令。假定要查找任何字符串ion,把这个搜索字符串称为模式。使用一般表达式和上面声明的变量Text,编写出下面的代码:

  

  String Pattern = "ion";

  MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions);

  foreach(Match NextMatch in Matches)

  { Console.WriteLine(NextMatch.Index); }

  在这段代码中,使用了System.Text.RegularExpressions名称空间中Regex类的静态方法Match()。这个方法的参数是一些输入文本、一个模式和RegexOptions每句中的一组可选标志。Matches()返回MatchCollection,每个匹配都用一个Match对象来表示。在上面的代码中,只是在集合中迭代,使用Match类的Index属性,返回输入文本中匹配所在的索引。运行这段代码,将得到1个匹配项。

  一般集合的功能主要取决于模式字符串。原因是模式字符串不但仅包含纯文本。如前所述。还包含元字符和转义序列,元字符是给出命令的特别字符,而转义序列的工作方式和C#的转义序列相同,他们都是以反斜杠\开头的字符,具备特别的含义。例如,假定要查找以n开头的字,就能够使用转义序列\b,他表示一个字的边界(字的边界是以某个字母数字标的字符开头,或后面是个空白字符或标点符号),下面编写如下代码:

  

  String Pattern = @"\bn";

  MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions.IgnoreCase 

  RegexOptions.ExplicitCapture);

  要在运行时把\b传递给.NET一般表达式引擎,反斜杠\不应被C#编译器解释为转义序列。假如要查找以序列ion结尾的字,能够使用下面的代码:

  

  String Pattern = @"ion\b";

  假如要查找以字母n开头,以序列ion结尾的任何字,需要一个以\bn开头,以ion\b结尾的模式,中间内容怎么办?需要告诉电脑n和ion中间的内容能够是任意长度的字符,只要字符不是空白即可,正确的模式如下所示:

  

  String Pattern = @"\bn\S*ion\b";

  4.2 特定字符或转义序列

  大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符 \(单个反斜杠)通知正则表达式分析器反斜杠后面的字符不是运算符。例如,分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (\*) 视为 Unicode 字符 002A。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!