熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

正則表達式編程Regex類用法

2013-11-13 09:54:43  來源: .NET編程 

  這一篇主要是將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許攸郭嘉需晃袁紹
   
    實際上有時候我們遇到的情況可能不僅僅這麼簡單例如有時候我們希望將字符串中的任何形式的ABCDEF實現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類的一些簡單用法也沒有講述正則表達式的相關知識不過即使如此也能減輕我們的一部分工作學習和靈活運用正則表達式是一個長期積累的過程


From:http://tw.wingwit.com/Article/program/net/201311/11949.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.