当前位置:编程学习 > C#/ASP.NET >>

解读 C# 中的正则表达式

 多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。
  
  此外,regexp类还能够完成一些其他的功能,例如从右至左的结合模式和表达式的编辑等。
  
  在这篇文章中,我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况,最后,还会介绍一些你可能会用到的常见的表达式。
  
  应该掌握的基础知识

  规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经掌握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。
  
  如果你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里·弗雷德尔编写的《掌握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。
  
  RegularExpression组合体

  regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如:

  csc r:System.Text.RegularExpressions.dll foo.cs

  命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。
  
  名字空间简介

  在名字空间中仅仅包含着6个类和一个定义,它们是:
  
  Capture: 包含一次匹配的结果;
  CaptureCollection: Capture的序列;
  Group: 一次组记录的结果,由Capture继承而来;
  Match: 一次表达式的匹配结果,由Group继承而来;
  MatchCollection: Match的一个序列;
  MatchEvaluator: 执行替换操作时使用的代理;
  Regex: 编译后的表达式的实例。

  Regex类中还包含一些静态的方法:

  Escape: 对字符串中的regex中的转义符进行转义;
  IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值;
  Match: 返回Match的实例;
  Matches: 返回一系列的Match的方法;
  Replace: 用替换字符串替换匹配的表达式;
  Split: 返回一系列由表达式决定的字符串;
  Unescape:不对字符串中的转义字符转义。

  简单匹配

  我们首先从使用Regex、Match类的简单表达式开始学习。
  
   Match m = Regex.Match("abracadabra", "(a|b|r)+"); 
  
  我们现在有了一个可以用于测试的Match类的实例,例如:if (m.Success)...
  如果想使用匹配的字符串,可以把它转换成一个字符串:
  
   Console.WriteLine("Match="+m.ToString()); 
  
  这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。
  
  字符串的替换

  简单字符串的替换非常直观。例如下面的语句:
  
   string s = Regex.Replace("abracadabra", "abra", "zzzz"); 
  
  它返回字符串zzzzcadzzzz,所有匹配的字符串都被替换成了zzzzz。

  现在我们来看一个比较复杂的字符串替换的例子:
  
   string s = Regex.Replace(" abra ", @"^s*(.*?)s*$", "$1"); 
  
  这个语句返回字符串abra,其前导和后缀的空格都去掉了。
  
  上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中,我们还经常使用字母字符串,在一个字母字符串中,编译程序不把字符“ ” 作为转义字符处理。在使用字符“”指定转义字符时,@"..."是非常有用的。另外值得一提的是$1在字符串替换方面的使用,它表明替换字符串只能包含被替换的字符串。
  
  匹配引擎的细节

  现在,我们通过一个组结构来理解一个稍微复杂的例子。看下面的例子:
  
   string text = "abracadabra1abracadabra2abracadabra3";
  
  string pat = @"
  
  ( # 第一个组的开始
  
  abra # 匹配字符串abra
  
  ( # 第二个组的开始
  
  cad # 匹配字符串cad
  
  )? # 第二个组结束(可选)
  
  ) # 第一个组结束
  
  + # 匹配一次或多次
  
  "; 

本文目录

  类与结构的实例比较

  类与结构的差别

  如何选择结构还是类

  一.类与结构的示例比较:

  结构示例:

   public struct Person
  {
  string Name;
  int  height;
  int  weight
  public bool overWeight()
  {
  //implement something
  }
  }
 
  类示例:
   public class TestTime
  {
  int hours;
  int minutes;
  int seconds;
  public void passtime()
  {
   //implementation of behavior
  }
  }
 
  调用过程:

   public class Test
  {
  public static ovid Main
  {
  Person Myperson=new Person      //声明结构
  TestTime Mytime=New TestTime    //声明类
  }
  }
   从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?

  二 .类与结构的差别

  1.值类型与引用类型

  结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型

  类是引用类型:引用类型在堆上分配地址

  堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑

  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

  注:

  1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object

  2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

  2.继承性

  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .

  类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承

  注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样

例如:结构实现接口

   interface IImage
  {
  void Paint();
  }
  struct Picture : IImage
  {
  public void Paint()
  {
  // painting code goes here
  }
  private int x, y, z;  // other struct members
  }
 
  3.内部结构:

  结构:

  没有默认的构造函数,但是可以添加构造函数

  没有析构函数

  没有 abstract 和 sealed(因为不能继承)

  不能有protected 修饰符

  可以不使用new 初始化

  在结构中初始化实例字段是错误的

  类:

  有默认的构造函数

  有析构函数

  可以使用 abstract 和 sealed

  有protected 修饰符

  必须使用new 初始化

  三.如何选择结构还是类

  讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

  1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

  2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

  3.在表现抽象和多级别的对象层次时,类是最好的选择

  4.大多数情况下该类型只是一些数据时,结构时最佳的选择


补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,