上一篇讲述了在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类的一些简单用法,也没有讲述正则表达式的相关知识,不过即使如此也能减轻我们的一部分工作,学习和灵活运用正则表达式是一个长期积累的过程。

周公
2010-02-25

转载于:https://www.cnblogs.com/zhoufoxcn/archive/2010/03/04/2515649.html

C#正则表达式编程(二):Regex类用法相关推荐

  1. c#中regex的命名空间_C# Regex类用法

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

  2. 【C++基础编程(二)】类和对象(重点)、文件操作

    4 类(class)和对象(object) C++面向对象的三大特性:封装.继承.多态 C++认为万事万物皆对象,对象上有其属性和行为 对于一些具有相同性质的对象,我们可以抽象称他们为类 4.1 封装 ...

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

    一.C#正则表达式符号模式 字 符 描 述 \ 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来 ^ 匹配输入字符串的开始位置 $ 匹配输入字符串的结束位置 * 匹配前面的零次或多次的子 ...

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

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

  5. c#中regex的命名空间_C#_详解C#正则表达式Regex常用匹配,使用Regex类需要引用命名空间 - phpStudy...

    详解C#正则表达式Regex常用匹配 使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 一.利用Regex类实现验证 示例1:注释的代码所起 ...

  6. QStyle类用法总结(二)

    1.前言 为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章.文章链接如下: <QStyle类用法总结(一)>.对Qt自定义 ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  8. 深入浅出C/C++中的正则表达式库(二)——Boost.Regex

    写在前面:本文是<深入浅出C/C++中的正则表达式库>系列的第二篇,如果对本文感兴趣,相信你也会对<深入浅出C/C++中的正则表达式库--GNU Regex Library>感 ...

  9. C#中使用Regex类来实现正则表达式

    前言 在上一篇的文章中,我们介绍了正则表达式的基本语法规则以及含义.那么在编写脚本时我们要如何使用它们呢?在不同的语言中,基本都提供了相对应的类库帮助我们实现,本文主要介绍正则在C#中的使用方法. R ...

最新文章

  1. Oracle下载汇聚
  2. SQL Server遗失管理权限账号密码怎么办?
  3. linux device_create_file属性 怎么调用,device_create_file创建多级目录
  4. eclipse32位python版下载_python之(3)Python Eclipse+PyDec下载和安装教程(超级详细)...
  5. day80 django模版学习
  6. doctor mysql数据导入_线上环境mysql主从同步的搭建过程
  7. csv文件 java_Java生成CSV文件实例详解
  8. flink globalwindow_《从0到1学习Flink》—— 介绍Flink中的Stream Windows
  9. maven 部署及使用
  10. java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
  11. 点晴oa系统搭服务器,免费OA办公系统的亮点所在
  12. java炫酷龙卷风源码,这个炫酷!迷你龙卷风发生装置
  13. 笔记01-如何创建一个vue3的项目
  14. HarmonyOS助力构建“食用菌智慧农场”
  15. android 阅读 翻页,极速PDF安卓版如何翻页、阅读模式修改等操作详解
  16. 车牌识别分割定位_解析车牌识别系统有什么优势?
  17. 以matlab为基础数学分析,matlab与数学分析.docx
  18. 信息安全——安全威胁
  19. C++排序——奖学金
  20. LINUX 指令学习

热门文章

  1. spring 数据库 链接db2_Druid,Java语言中最好的数据库连接池
  2. 2022年最值得学习的 5 种编程语言,你有在学习吗?
  3. C语言编程笔记:关于 for循环 的那些不为人知的秘密
  4. 可运行的c语言程序的扩展名为什么?
  5. 蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)
  6. python做股票分析_利用Python进行股票投资组合分析(调试)
  7. android 获取当前网络,Android 获取当前网络连接的类型信息
  8. [渝粤教育] 中国地质大学 高级会计学 复习题
  9. 【渝粤教育】电大中专药物分析技术基础作业 题库
  10. 电源模块质量好不好,看看以下5点就知道了!