C#正则表达式编程(二):Regex类用法
上一篇講述了在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类用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中使用多线程访问Winform问题解
- 下一篇: Delphi关于多线程同步的一些方法