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