這一篇主要是將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(
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))
其實在 中很多類都有這樣類似的情況
在System
IO命名空間下還有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
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]{
}
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類的一些簡單用法
也沒有講述正則表達式的相關知識
不過即使如此也能減輕我們的一部分工作
學習和靈活運用正則表達式是一個長期積累的過程
From:http://tw.wingwit.com/Article/program/net/201311/11949.html