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

简介:




上一篇讲述了在C#中有关正则表达式的类之间的关系,以及它们的方法,这一篇主要是将Regex这个类的用法的,关于MatchMatchCollection类会在下一篇讲到。

对于正则表达式的应用,基本上可以分为验证、提取、分割和替换。仅仅利用Regex类就可以实现验证和简单替换。
利用Regex类实现验证
经历2009年的备案和DNS停止解析风波之后,大部分的带有反馈性的网站和论坛都对一些敏感词进行了过滤,包含有这类敏感词的文章要么内容被替换要么被禁止发表,利用Regex类就可以实现这个功能,下面是一个例子:
/// <summary> 
InBlock.gif 
/// 检查字符串中是否有“孙权”这个敏感词 
InBlock.gif 
/// </summary> 
InBlock.gif 
InBlock.gif public  void IsMatchDemo() 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif         string source =  "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操许攸郭嘉需晃袁绍"
InBlock.gif 
InBlock.gif        Regex regex =  new Regex( "孙权"); 
InBlock.gif 
InBlock.gif         //if (Regex.IsMatch(source, "孙权")) 
InBlock.gif 
InBlock.gif         //下面这句和上面被注释掉的一句作用的同样的 
InBlock.gif 
InBlock.gif         if (regex.IsMatch(source)) 
InBlock.gif 
InBlock.gif        { 
InBlock.gif 
InBlock.gif                Console.WriteLine( "字符串中包含有敏感词:孙权!"); 
InBlock.gif 
InBlock.gif        } 
InBlock.gif 
输出结果:字符串中包含有敏感词:孙权!
对于上面的例子,如果要检查的字符串中包含“孙权”这个关键词就会在控制台上输出提示,当然在实际的应用中可能是包含有被禁止的词语的内容不允许提交而不是仅仅提示了。不过这类情况仍有办法可以绕过,可以使用“孙-权”或“孙+权”来替换孙权从而来绕过验证。
对于中文字符串还比较好说,对于英文的字符串还要考虑每个字母的大小写情况了。比如我们禁止在内容中出现某个关键词(如太CCTVCCTV,或者CCAV),难道我们要针对字符串中每个字母的大小写情况进行多种情况的组合验证?不,完全没有必要,下面就是一个例子:
InBlock.gif    
InBlock.gif 
/// <summary> 
InBlock.gif 
/// 检查字符串中是否有“def”的任何大小写形式 
InBlock.gif 
/// </summary> 
InBlock.gif 
InBlock.gif public  void IsMatchDemoWithOption() 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif         string source =  "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍"
InBlock.gif 
InBlock.gif        Regex regex =  new Regex( "def",RegexOptions.IgnoreCase); 
InBlock.gif 
InBlock.gif         if (regex.IsMatch(source)) 
InBlock.gif 
InBlock.gif        { 
InBlock.gif 
InBlock.gif                Console.WriteLine( "字符串中包含有敏感词:def!"); 
InBlock.gif 
InBlock.gif        } 
InBlock.gif 
InBlock.gif
InBlock.gif 
输出结果:字符串中包含有敏感词:def
 
在上面的例子中,实例化Regex时采用了两个带参数的构造函数,其中第二个参数就是上一篇中提到的RegexOptions枚举,RegexOptions.IgnoreCase表示匹配字符串的时候不管大小写是否一致。
此外,在Regex中存在着一些功能相同的静态方法和实例方法,如:IsMatch()方法,在第一个例子中我还写出了两种方法的实例,如下:
InBlock.gifRegex regex =  new Regex( "孙权"); 
InBlock.gif 
InBlock.gif //if (Regex.IsMatch(source, "孙权")) 
InBlock.gif 
InBlock.gif //下面这句和上面被注释掉的一句作用的同样的 
InBlock.gif 
InBlock.gif if (regex.IsMatch(source))
其实在.NET Framework中很多类都有这样类似的情况,在System.IO命名空间下还有FileFileInfo这样的静态类和非静态类的情况,其实它们提供了相似的功能,用小沈阳的话说“这是为什么呢”?有部分是出自效率的考虑,并且也有出自让代码编写方便和看起来简洁的因素。对于偶尔一半次为之的情况,建议使用静态方法,这样有可能会提高效率(因为采用静态方法调用的正则表达式会被内部缓存,默认情况下会缓存15个,可以通过设置Regex类的CacheSize属性来更改缓存个数),如果是要在循环中多次使用,那就采用实例方法吧。
使用Regex类进行替换
上面的处理仅仅是查看提交的内容中是否有被禁止的关键词,其实有时候还可以做到将被禁止的关键词进行替换,例如将上面用到的字符串中的任何形式的"ABC"替换成"|",下面就是一个例子:
/// <summary> 
InBlock.gif 
/// 实现字符串替换功能 
InBlock.gif 
/// </summary> 
InBlock.gif 
InBlock.gif public  void Replace() 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif         string source =  "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍"
InBlock.gif 
InBlock.gif        Regex regex =  new Regex( "abc", RegexOptions.IgnoreCase); 
InBlock.gif 
InBlock.gif         string result=regex.Replace(source,  "|"); 
InBlock.gif 
InBlock.gif        Console.WriteLine( "原始字符串:" + source); 
InBlock.gif 
InBlock.gif        Console.WriteLine( "替换后的字符串:" + result); 
InBlock.gif 
InBlock.gif}
输出结果:
原始字符串:刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍
替换后的字符串:刘备|关羽|张飞|赵云|诸葛亮|孙权|周瑜|鲁肃|曹操DEF许攸郭嘉需晃袁绍
实际上有时候我们遇到的情况可能不仅仅这么简单,例如有时候我们希望将字符串中的任何形式的“ABC”及“DEF”实现HTML形式的加粗,也就是替换成<b>abc</b><b>def</b>这种形式,当然还保持和原来一致的大小写形式,代码如下:
/// <summary> 
InBlock.gif 
/// 实现字符串替换功能 
InBlock.gif 
/// </summary> 
InBlock.gif 
InBlock.gif public  void ReplaceMatchEvaluator() 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif         string source =  "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍"
InBlock.gif 
InBlock.gif        Regex regex =  new Regex( "[A-Z]{3}", RegexOptions.IgnoreCase); 
InBlock.gif 
InBlock.gif         string result = regex.Replace(source,  new MatchEvaluator(OutPutMatch)); 
InBlock.gif 
InBlock.gif        Console.WriteLine( "原始字符串:" + source); 
InBlock.gif 
InBlock.gif        Console.WriteLine( "替换后的字符串:" + result); 
InBlock.gif 
InBlock.gif
InBlock.gif 
/// <summary> 
InBlock.gif 
/// MatchEvaluator委托中调用的方法,可以对匹配结果进行处理 
InBlock.gif 
/// </summary> 
InBlock.gif 
/// <param name="match">操作过程中的单个正则表达式匹配</param> 
InBlock.gif 
/// <returns></returns> 
InBlock.gif 
InBlock.gif private  string OutPutMatch(Match match) 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif         return  "<b>" + match.Value +  "</b>"
InBlock.gif 
InBlock.gif}
输出结果如下:
原始字符串:刘备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类的一些简单用法,也没有讲述正则表达式的相关知识,不过即使如此也能减轻我们的一部分工作,学习和灵活运用正则表达式是一个长期积累的过程。




















本文转自周金桥51CTO博客,原文链接: http://blog.51cto.com/zhoufoxcn/280580  ,如需转载请自行联系原作者


相关文章
|
1月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
61 2
|
12天前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
26 2
|
16天前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
28 1
|
25天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
43 11
|
1月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
17 2
|
17天前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
49 0
|
18天前
|
前端开发 C#
C# 一分钟浅谈:字符串操作与正则表达式
本文详细介绍C#中的字符串操作与正则表达式应用,涵盖字符串拼接、分割、查找及替换等基础操作,并通过实例讲解正则表达式的模式匹配、文本替换与分组捕获技巧。同时,文章还探讨了性能优化、复杂度管理和安全性等问题及解决策略,助你提升编程效率,应对实际开发挑战。
50 0
|
2月前
|
Python
告别死记硬背:掌握Python正则表达式re模块的高效应用&[面向百度编程]
Python中正则表达式的高效应用,通过内置的`re`模块,讲解了如何匹配、提取和替换字符串,并提供了相关示例代码,同时提倡通过实践来掌握正则表达式的使用,而不是仅仅依赖网络搜索。
37 1
|
2月前
|
C#
C#中的类和继承
C#中的类和继承
37 6