zoukankan      html  css  js  c++  java
  • c# 第七课 NET 框架的正则表达式类

    下面通过介绍 .NET 框架的正则表达式类,熟悉一下.NET框架下的正则表达式的使用方法。

     1 Regex 类表示只读正则表达式

      Regex 类包含各种静态方法,允许在不显式实例化其他类的对象的情况下使用其他正则表达式类。以下代码示例创建了 Regex 类的实例并在初始化对象时定义一个简单的正则表达式。请注意,使用了附加的反斜杠作为转义字符,它将 s 匹配字符类中的反斜杠指定为原义字符。

    Regex r; // 声明一个 Regex类的变量
    r = new Regex("\s2000"; // 定义表达式 

     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 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; //记录匹配字符的位置


      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 

      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[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 

     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; //捕获对象长度
     }

    IsMatch 如果正则表达式在输入字符串中发现匹配,返回“Ture”。

    例如,下面的函数演示了如何使用正则表达式验证邮政编码:

    private void ValidateZipButton_Click(object sender, System.EventArgs e)

    {    

    String ZipRegex = @"^d{5}$";  

      if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))

       {     

          ResultLabel.Text = "ZIP is valid!";  

      }    

      else  

      {       ResultLabel.Text = "ZIP is invalid!";  

      } }
     

     
      Replace 用给定的替换字符串替换输入字符串中的匹配。 可以使用静态 Replace() 方法将匹配替换为特定字符串,如下所示:
    String newText = Regex.Replace(inputString, pattern, replacementText);
    更改日期格式(用dd-mm-yy的日期形式替代mm/dd/yy的日期形式) string MDYToDMY(string input)


    Split 将输入字符串拆分成用正则表达式匹配分开的数组元素时,返回数组字符串。  
    除了指定很多方法外,还有一些选项可以指定,通常在 Regex 对象构造函数中。由于这些选项是位屏蔽的一部分,或许可以同时指定这些选项(如,可以同时指定 Multiline 和 Singleline)。


    通常,在您需要指定默认方式以外的方式时,需要实例化 Regex 类的实例。特别是在设置选项时。例如,要创建忽略大小写和模式空白区域的 Regex 实例,然后检索与该表达式匹配的集合,则应使用如下代码:


    Regex re = new Regex(pattern,    

     RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

    MatchCollection mc = re.Matches(inputString);
    方法 说明  Compiled 当在循环中执行许多匹配操作时使用此选项。这可以节省每一循环的分析表达式步骤。   Multiline 它与输入字符串中的行数没有关系。确切地说,它只修改 ^ 和 $ 的方式,以便匹配行开始 (BOL) 和行结尾 (EOL),而不是匹配整个输入字符串的开始和结尾。   IgnoreCase 使模式在匹配搜索字符串时忽略大小写。   IgnorePatternWhitespace 允许根据需要在模式中包括任意数量的空白区域,也支持使用 (?# 注释 #) 语法在模式中加入注释。   SingleLine 它与输入字符串中的行数没有关系。更确切地说,它将导致 .(句点)元字符匹配任意字符,而不是除   之外的任意字符(默认情况)。

  • 相关阅读:
    acdream 瑶瑶带你玩激光坦克 (模拟)
    acdream 小晴天老师系列——苹果大丰收(DP)
    acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)
    acdream 小晴天老师系列——竖式乘法(简单穷举)
    acdream LCM Challenge (最小公倍数)
    LeetCode Product of Array Except Self (除自身外序列之积)
    LeetCode Implement Trie (Prefix Tree) (实现trie树3个函数:插入,查找,前缀)
    字节流与字符流的区别
    oop第二章1知识点汇总
    抽象类和抽象方法的一些概念(转自百度)
  • 原文地址:https://www.cnblogs.com/GSONG/p/4477594.html
Copyright © 2011-2022 走看看