上一篇讲述了在C#中有关正则表达式的类之间的关系,以及它们的方法,这一篇主要是将Regex这个类的用法的,关于Match及MatchCollection类会在下一篇讲到。
对于正则表达式的应用,基本上可以分为验证、提取、分割和替换。仅仅利用Regex类就可以实现验证和简单替换。
利用Regex类实现验证
经历2009年的备案和DNS停止解析风波之后,大部分的带有反馈性的网站和论坛都对一些敏感词进行了过滤,包含有这类敏感词的文章要么内容被替换要么被禁止发表,利用Regex类就可以实现这个功能,下面是一个例子:

/// <summary>
/// 检查字符串中是否有“孙权”这个敏感词
/// </summary>
public void IsMatchDemo()
{
string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操许攸郭嘉需晃袁绍";
Regex regex = new Regex("孙权");
//if (Regex.IsMatch(source, "孙权"))
//下面这句和上面被注释掉的一句作用的同样的
if (regex.IsMatch(source))
{
Console.WriteLine("字符串中包含有敏感词:孙权!");
}

输出结果:字符串中包含有敏感词:孙权!
对于上面的例子,如果要检查的字符串中包含“孙权”这个关键词就会在控制台上输出提示,当然在实际的应用中可能是包含有被禁止的词语的内容不允许提交而不是仅仅提示了。不过这类情况仍有办法可以绕过,可以使用“孙-权”或“孙+权”来替换孙权从而来绕过验证。
对于中文字符串还比较好说,对于英文的字符串还要考虑每个字母的大小写情况了。比如我们禁止在内容中出现某个关键词(如太CCTV的CCTV,或者CCAV),难道我们要针对字符串中每个字母的大小写情况进行多种情况的组合验证?不,完全没有必要,下面就是一个例子:

/// <summary>
/// 检查字符串中是否有“def”的任何大小写形式
/// </summary>
public void IsMatchDemoWithOption()
{
string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍";
Regex regex = new Regex("def",RegexOptions.IgnoreCase);
if (regex.IsMatch(source))
{
Console.WriteLine("字符串中包含有敏感词:def!");
}
}

输出结果:字符串中包含有敏感词:def!

在上面的例子中,实例化Regex时采用了两个带参数的构造函数,其中第二个参数就是上一篇中提到的RegexOptions枚举,RegexOptions.IgnoreCase表示匹配字符串的时候不管大小写是否一致。
此外,在Regex中存在着一些功能相同的静态方法和实例方法,如:IsMatch()方法,在第一个例子中我还写出了两种方法的实例,如下:

Regex regex = new Regex("孙权");
//if (Regex.IsMatch(source, "孙权"))
//下面这句和上面被注释掉的一句作用的同样的
if (regex.IsMatch(source))

其实在.NET Framework中很多类都有这样类似的情况,在System.IO命名空间下还有File及FileInfo这样的静态类和非静态类的情况,其实它们提供了相似的功能,用小沈阳的话说“这是为什么呢”?有部分是出自效率的考虑,并且也有出自让代码编写方便和看起来简洁的因素。对于偶尔一半次为之的情况,建议使用静态方法,这样有可能会提高效率(因为采用静态方法调用的正则表达式会被内部缓存,默认情况下会缓存15个,可以通过设置Regex类的CacheSize属性来更改缓存个数),如果是要在循环中多次使用,那就采用实例方法吧。
使用Regex类进行替换
上面的处理仅仅是查看提交的内容中是否有被禁止的关键词,其实有时候还可以做到将被禁止的关键词进行替换,例如将上面用到的字符串中的任何形式的"ABC"替换成"|",下面就是一个例子:

/// <summary>
/// 实现字符串替换功能
/// </summary>
public void Replace()
{
string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍";
Regex regex = new Regex("abc", RegexOptions.IgnoreCase);
string result=regex.Replace(source, "|");
Console.WriteLine("原始字符串:" + source);
Console.WriteLine("替换后的字符串:" + result);
}

输出结果:
原始字符串:刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍
替换后的字符串:刘备|关羽|张飞|赵云|诸葛亮|孙权|周瑜|鲁肃|曹操DEF许攸郭嘉需晃袁绍
实际上有时候我们遇到的情况可能不仅仅这么简单,例如有时候我们希望将字符串中的任何形式的“ABC”及“DEF”实现HTML形式的加粗,也就是替换成<b>abc</b>及<b>def</b>这种形式,当然还保持和原来一致的大小写形式,代码如下:

/// <summary>
/// 实现字符串替换功能
/// </summary>
public void ReplaceMatchEvaluator()
{
string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍";
Regex regex = new Regex("[A-Z]{3}", RegexOptions.IgnoreCase);
string result = regex.Replace(source, new MatchEvaluator(OutPutMatch));
Console.WriteLine("原始字符串:" + source);
Console.WriteLine("替换后的字符串:" + result);
}
/// <summary>
/// MatchEvaluator委托中调用的方法,可以对匹配结果进行处理
/// </summary>
/// <param name="match">操作过程中的单个正则表达式匹配</param>
/// <returns></returns>
private string OutPutMatch(Match match)
{
return "<b>" + match.Value + "</b>";
}

输出结果如下:
原始字符串:刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍
替换后的字符串:刘备<b>ABC</b>关羽<b>ABc</b>张飞<b>Abc</b>赵云<b>abc</b>诸葛亮<b>aBC</b>孙权<b>abC</b>周瑜<b>AbC</b>鲁肃<b>aBc</b>曹操<b>DEF</b>许攸郭嘉需晃袁绍
在上面的例子中,我们使用了MatchEvaluator委托,并且还涉及到了Match类(Match类将会在下一篇讲述),在MatchEvaluator委托中使用到的Match类表示了单个的正则表达式匹配,通过改变match实例中Value的值来达到完成替换的目的。
在本篇中仅仅是讲述了Regex类的一些简单用法,也没有讲述正则表达式的相关知识,不过即使如此也能减轻我们的一部分工作,学习和灵活运用正则表达式是一个长期积累的过程。

C#正则表达式编程(二):Regex类用法的更多相关文章

  1. C# Regex类用法

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现全部匹配输出 string str = "test43232 ...

  2. Python入门之面向对象编程(二)python类的详解

    本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 T ...

  3. Java正则表达式java.util.regex类的简单使用

    1.什么是正则表达式? 正则表达式(regular expression)是根据字符串集合内每个字符串共享的共同特性来描述字符串集合的一种途径.正则表达式可以用于搜索.编辑或者处理文本和数据. Jav ...

  4. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  5. (转)C#正则表达式Regex类的用法

    原文地址如下:http://www.studyofnet.com/news/297.html 一.C#正则表达式符号模式 字 符 描 述 \ 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反 ...

  6. C#正则表达式编程(三):Match类和Group类用法

    前面两篇讲述了正则表达式的基础和一些简单的例子,这篇将稍微深入一点探讨一下正则表达式分组,在.NET中正则表达式分组是用Match类来代表的.首先先看一段代码: /// <summary> ...

  7. C#正则表达式编程(一):C#中有关正则的类

    正则表达式是一门灵活性非常强的语言,匹配同样的字符串可能在不同的开发人员那里会得到不同的结果,在平常的时候也是用的时候看看相关资料,不用的时候就丢在脑后了,尽管在处理大部分情况下都能迅速处理,但是处理 ...

  8. C#正则表达式Regex类的介绍

    一.在C#中,要使用正则表达式类,请在源文件开头处添加以下语句: using System.Text.RegularExpressions; 二.RegEx类常用的方法 1.静态Match方法 使用静 ...

  9. C#正则表达式Regex类

    C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...

随机推荐

  1. api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案

    api-ms-win-crt-runtime就是MFC的运行时环境的库, 在windows上编译也是用微软的visual studio C++编译的软件, 底层也会用到微软提供的C++库和runtim ...

  2. POI读取/写入Excel文件

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  3. WWDC 2016 总结

    一年一次的WWDC,是开发者充值信仰的时刻,今天你的信仰充值了吗?欢迎在本文下面留言吐槽. 有外媒称,这届WWDC苹果将“fun”伪装成“innovation”,的确,看看另两家老对手,微软有黑科技H ...

  4. VirtualBox启动虚拟机报错0x80004005

    Unable to load R3 module C:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 ( ...

  5. ACM题目————中缀表达式转后缀

    题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...

  6. Android Webview实现文件下载功能

        在做美图欣赏Android应用的时候,其中有涉及到Android应用下载的功能,这个应用本身其实也比较简单,就是通过WebView控制调用相应的WEB页面进行展示.刚开始以为和普通的文件下载实 ...

  7. poj1222 EXTENDED LIGHTS OUT

    设输入矩阵为A,输出矩阵为B,目标矩阵为C(零矩阵). 方便起见,矩阵行列下标均从1开始. 考虑A矩阵元素a(i,j),B矩阵中与其相邻的元素 b(i,j),b(i - 1, j),b(i + 1,j ...

  8. ceil floor函数

    > a=6.4> b=math.ceil(a)> print(b)7> c=math.floor(a)> print(c)6 ceil向上取整 floor向下取整

  9. 北邀 E Elegant String

    E. Elegant String Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer ...

  10. java中split()特殊符号"." "|" "*" "\" "]"

    关于点的问题是用string.split("[.]") 解决. 关于竖线的问题用 string.split("\\|")解决. 关于星号的问题用 string. ...