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 它与输入字符串中的行数没有关系。更确切地说,它将导致 .(句点)元字符匹配任意字符,而不是除 \n 之外的任意字符(默认情况)。

posted @ 2015-05-04 21:33  郭松  阅读(165)  评论(0编辑  收藏  举报