在命名空间RegularExpressions里有下面这些对象,10个类,一个代理,一个枚举类型

摘抄自:http://blog.csdn.net/weiwenhp/article/details/7665816

Classes

  Class Description
  Capture Represents the results from a single subexpression capture. Capture represents one substring for a single successful capture.
  CaptureCollection Represents a sequence of capture substrings. CaptureCollection returns the set of captures done by a single capturing group.
  Group Group represents the results from a single capturing group. A capturing group can capture zero, one, or more strings in a single match because of quantifiers, soGroup supplies a collection of Capture objects.
  GroupCollection Represents a collection of captured groups. GroupCollection returns the set of captured groups in a single match.
  Match Represents the results from a single regular expression match.
  MatchCollection Represents the set of successful matches found by iteratively applying a regular expression pattern to the input string.
  Regex Represents an immutable regular expression.
  RegexCompilationInfo Provides information about a regular expression that is used to compile a regular expression to a stand-alone assembly.
  RegexRunner Infrastructure. The RegexRunner class is the base class for compiled regular expressions.
  RegexRunnerFactory Infrastructure. Creates a RegexRunner class for a compiled regular expression.

Delegates

  Delegate Description
  MatchEvaluator Represents the method that is called each time a regular expression match is found during a Replace method operation.

Enumerations

  Enumeration Description
  RegexOptions Provides enumerated values to use to set regular expression options.

这些类里最主要的类其实是Regex,其他类都是在使用Regex类中的方法时而用到的.

类Regex类中有很多静态(static)方法,我们可以直接调用那些方法而不用实例化一个Regex类.但同时Regex类中还有与静态方法功能完全一样的实例方法.

就是说你可以通过实例化Regex后再去用.

是直接调用静态方法还是先实例化而调用实例方法其实没太大区别,只是传参数时稍微有一点点区别.至于你喜欢那一种方式,就任凭你自己的爱好了.

不过一般情况下如果只是少数几次使用正则静态式,一般用静态方法方便点.如果是频繁的使用正则表达式,则实例化类可能性能好点.下面举两个验证字符和提取字符简单的例子来说明用静态方法和实例方法的的细微区别

静态方法:

string str = "csdn.net/weiwenhp";

string pattern = "(?<=/).*(?=hp)";   //匹配/和hp之间的字符

bool exist = Regex.IsMatch(str, pattern);  //验证下是否匹配成功

string result = Regex.Match(str, pattern).Value; //匹配到的值

if(exist)

Console.WriteLine(result);  //结果是weiwen

实例方法 :

string str = "csdn.net/weiwenhp";

string pattern = "(?<=/).*(?=hp)";

Regex reg = new Regex(pattern); //实例化一个Regex类

bool exist = reg.IsMatch(str);   //这里用法和静态方法基本一样,只不过实例化时用了参数pattern,这里就不再需要这参数了

string result = reg.Match(str).Value;

if(exist)

Console.WriteLine(result); //结果也同样是weiwen

下面介绍下Regex的Replace方法和代理MatchEvaluator

我们知道正则表达式主要是实现验证,提取,分割,替换字符的功能.Replace函数是实现替换功能的.

Replace函数有四个重载函数

1 )Replace(string input,string pattern,string replacement)  //input是源字符串,pattern是匹配的条件,replacement是替换的内容,就是把符合匹配条件pattern的内容转换成它

比如string result = Regex.Replace("abc", "ab", "##");  //结果是##c,就是把字符串abc中的ab替换成##

2 )Replace(string input,string pattern,string replacement,RegexOptions options)      //RegexOptions是一个枚举类型,用来做一些设定.

//前面用注释时就用到了RegexOptions.IgnorePatternWhitespace.如果在匹配时忽略大小写就可以用RegexOptions.IgnoreCase

比如string result = Regex.Replace("ABc", "ab", "##",RegexOptions.IgnoreCase);

如果是简单的替换用上面两个函数就可以实现了.但如果有些复杂的替换,比如匹配到很多内容,不同的内容要替换成不同的字符.就需要用到下面两个函数

3 )Replace(string input,string pattern,MatchEvaluator evaluator);    //evaluator是一个代理,其实简单的说是一个函数指针,把一个函数做为参数参进来

//由于C#里没有指针就用代理来实现类似的功能.你可以用代理绑定的函数来指定你要实现的复杂替换.

4 )Replace(string input,string pattern,MatchEvaluator evaluator,RegexOptions options);//这个函数上上面的功能一样,只不过多了一点枚举类型来指定是否忽略大小写等设置

先来看个简单的例子

例子1

如果一个字符串中有两次出现arwen,我要把第一次出现的替换成weiwen(1),第二次出现的替换成weiwen(2)

public static int i = 0;

static void Main(string[] args)

{

string source = "##arwen***&&arwen###";

string pattern = "arwen";

string result;

MatchEvaluator me = Replace;  //声明一个代理,并绑定一个函数.其实就相当于me是一个指向函数Replace的指针

result = Regex.Replace(source, pattern, me); //把me也可以看成是函数Replace当参数传进去

Console.WriteLine(result); //结果是"##weiwen(1)***&&weiwen(2)###";

}

public static string Replace(Match ma)

{

if (ma.Success)

{

i++;

return "weiwen" +string.Format("({0})",i);

}

return "NULL";

}

不过看了上面的代码还是有点晕,不知道它从头到尾是以什么样的顺序什么样的逻辑执行过来的.

result = Regex.Replace(source, pattern, me);//这看起来就一句话,其实它里面有很多复杂的操作,并且还有循环多次的操作

//首先会去这样匹配 MatchCollection matchs = Regex.Matches(source, pattern);由于会匹配到两个arwen.所以集合matchs中会有两个值

//matchs[0].Value = "arwen"; matchs[1] = "arwen".  然后会用for(int i = 0;i < matchs.matchs.Count;i++)

//{

// matchs[i] =   Replace(matchs[i]);  //这是这里把字符串替换了

//}

当然我上面说的只是大概解释下背后的大概流程应该是什么样的.

实现使用时我们只会用到result = Regex.Replace(source, pattern, me);这一句就OK了

例子2

上面说的是匹配相同的字符.那再举个例子说下匹配到不同的内容并做不同的替换

假如字符串中有数字2则替换成GOD,有数字3则替换成HELL.

string source = "aa2bb3cc";

string pattern = @"\d";

string result;

MatchEvaluator me = Replace;

result = Regex.Replace(source, pattern, me);

Console.WriteLine(result);  //结果是aaGODbbHELLcc

public static string Replace(Match ma)

{

switch (ma.Value)

{

case "2":

return "GOD";

break;

case "3":

return "HELL";

break;

default:

return "NULL";

break;

}

}

时间: 2024-11-29 11:09:04

在命名空间RegularExpressions里有下面这些对象,10个类,一个代理,一个枚举类型的相关文章

MyBatis对于Java对象里的枚举类型处理

平时咱们写程序实体类内或多或少都会有枚举类型属性,方便嘛.但是mybatis里怎么处理他们的增删改查呢? 要求: 插入的时候,会用枚举的定义插入数据库,我们希望在数据库中看到的是数字或者其他东西: 查询的时候,数据库的值可以自动转换为我们对应的枚举值. 举例,我有一个这样的枚举类型: Java Code复制内容到剪贴板 package cn.com.shuyangyang.domain; public enum UserStatus { /** 无效*/ DISABLED(0), /** 有效 

获取数据库连接对象的工具类

mysql连接对象 jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/查找的文件jdbc.user=rootjdbc.password=自己设置的密码 oracle连接对象 jdbc.driver=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@localhost:1521:orcljdbc.user=scottjdbc.password=

winfrom获取用户控件里的控件对象

如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环获得所有控件. 然后根据类型筛选出这个类型的所有控件.然后就可以用Name来判断了 foreach(var lb in mi_image1.Controls) {    if (lb is Label)    {         Label obj = lb as Label;   //如果把循环改

编写高质量代码改善C#程序的157个建议——建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间

建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间 在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”.那么,什么东西算得上是一个对象呢?对象有属性.有行为.以动物为例,比如猫(Cat).Cat可以有Name,这就是属性:Cat有一个恶习ScratchSofa(挠沙发),这就是行为.我们把这些属性和行为结合起来,就称为一个类型: class Cat { public string Name { get; set; } public void ScratchSofa()

NX二次开发-算法篇-判断找到两个数组里不相同的对象

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_curve.h> 5 #include <uf_modl.h> 6 #include <vector> 7 #include <uf_disp.h> 8 9 10 UF_initialize(); 11 12 //第一步,创建5条直线 13 UF_CURVE_line_t Coords1; 14 Coords1.start_point[0] = 0.0

Objective-C对象之类对象和元类对象

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/8592492 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 作为C语言的超集,面向对象成为Objective-C与C语言的最大区别,因此,对象是Objective-C中最重要的部分之一.目前面向对象的语言有很多,Objective-C中的对象又和其他语言中的对象有什么区别呢?下面来简单介绍Objectiv

Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 注意点: self ,我们讲过了,self = 对象,实例化后的对象调用类的各种成员的时候的self就是这个对象. 而且我们也讲过了

从头认识多线程-2.2 synchronized持有对象锁与类锁的相同点

这一章节我们来讨论一下synchronized持有对象锁与类锁的相同点. 1.当所有方法都不使用同步的时候 代码清单 package com.ray.deepintothread.ch02.topic_2; public class SynchInstance1 { public static void main(String[] args) throws InterruptedException { MyTestObjectOne myTestObjectOne = new MyTestObj

[012]复制对象时勿忘其每一个成分

引言: 在深拷贝和浅拷贝的理解中,我们知道了“拷贝构造函数”一词,并且也了解了它的构成. A(const A& r); // 形式有多种,在这里只列出一个 因此,在值传递的应用场景里,我们可以写出以下的拷贝构造函数: 1 #include <iostream> 2 #include<string> 3 using namespace std; 4 5 class A { 6 public: 7 A(int i) : count(i) {}; 8 A(const A&