文章目錄
在命名空間RegularExpressions裡有下面這些對象,10個類,一個代理,一個枚舉類型Classes
| |
Class |
Description |
|
Capture |
Represents the results from a single subexpression capture. Capture represents one substring for a single successful capture. |
|
CaptureCollection |
Represents a sequence of capture substrings. CaptureCollection returns the set of captures done by a single capturing group. |
|
Group |
Group represents the results from a single capturing group. A capturing group can capture zero, one, or more strings in a single match because of quantifiers, soGroup supplies a collection of Capture objects. |
|
GroupCollection |
Represents a collection of captured groups. GroupCollection returns the set of captured groups in a single match. |
| |
Match |
Represents the results from a single regular expression match. |
| |
MatchCollection |
Represents the set of successful matches found by iteratively applying a regular expression pattern to the input string. |
|
Regex |
Represents an immutable regular expression. |
| |
RegexCompilationInfo |
Provides information about a regular expression that is used to compile a regular expression to a stand-alone assembly. |
| |
RegexRunner |
Infrastructure. The RegexRunner class is the base class for compiled regular expressions. |
| |
RegexRunnerFactory |
Infrastructure. Creates a RegexRunner class for a compiled regular expression. |
Delegates
| |
Delegate |
Description |
| |
MatchEvaluator |
Represents the method that is called each time a regular expression match is found during a Replace method operation. |
Enumerations
| |
Enumeration |
Description |
| |
RegexOptions |
Provides enumerated values to use to set regular expression options. |
這些類裡最主要的類其實是Regex,其他類都是在使用Regex類中的方法時而用到的.
類Regex類中有很多靜態(static)方法,我們可以直接調用那些方法而不用執行個體化一個Regex類.但同時Regex類中還有與靜態方法功能完全一樣的執行個體方法.
就是說你可以通過執行個體化Regex後再去用.
是直接調用靜態方法還是先執行個體化而調用執行個體方法其實沒太大區別,只是傳參數時稍微有一點點區別.至於你喜歡那一種方式,就任憑你自己的愛好了.
不過一般情況下如果只是少數幾次使用正則靜態式,一般用靜態方法方便點.如果是頻繁的使用Regex,則執行個體化類可能效能好點.下面舉兩個驗證字元和提取字元簡單的例子來說明用靜態方法和執行個體方法的的細微區別
靜態方法:
string str = "csdn.net/weiwenhp";
string pattern = "(?<=/).*(?=hp)"; //匹配/和hp之間的字元
bool exist = Regex.IsMatch(str, pattern); //驗證下是否匹配成功
string result = Regex.Match(str, pattern).Value; //匹配到的值
if(exist)
Console.WriteLine(result); //結果是weiwen
執行個體方法 :
string str = "csdn.net/weiwenhp";
string pattern = "(?<=/).*(?=hp)";
Regex reg = new Regex(pattern); //執行個體化一個Regex類
bool exist = reg.IsMatch(str); //這裡用法和靜態方法基本一樣,只不過執行個體化時用了參數pattern,這裡就不再需要這參數了
string result = reg.Match(str).Value;
if(exist)
Console.WriteLine(result); //結果也同樣是weiwen
下面介紹下Regex的Replace方法和代理MatchEvaluator
我們知道Regex主要是實現驗證,提取,分割,替換字元的功能.Replace函數是實現替換功能的.
Replace函數有四個重載函數
1 )Replace(string input,string pattern,string replacement) //input是源字串,pattern是匹配的條件,replacement是替換的內容,就是把符合匹配條件pattern的內容轉換成它
比如string result = Regex.Replace("abc", "ab", "##"); //結果是##c,就是把字串abc中的ab替換成##
2 )Replace(string input,string pattern,string replacement,RegexOptions options) //RegexOptions是一個枚舉類型,用來做一些設定.
//前面用注釋時就用到了RegexOptions.IgnorePatternWhitespace.如果在匹配時忽略大小寫就可以用RegexOptions.IgnoreCase
比如string result = Regex.Replace("ABc", "ab", "##",RegexOptions.IgnoreCase);
如果是簡單的替換用上面兩個函數就可以實現了.但如果有些複雜的替換,比如匹配到很多內容,不同的內容要替換成不同的字元.就需要用到下面兩個函數
3 )Replace(string input,string pattern,MatchEvaluator evaluator); //evaluator是一個代理,其實簡單的說是一個函數指標,把一個函數做為參數參進來
//由於C#裡沒有指標就用代理來實作類別似的功能.你可以用代理綁定的函數來指定你要實現的複雜替換.
4 )Replace(string input,string pattern,MatchEvaluator evaluator,RegexOptions options);//這個函數上上面的功能一樣,只不過多了一點枚舉類型來指定是否忽略大小寫等設定
先來看個簡單的例子
例子1
如果一個字串中有兩次出現arwen,我要把第一次出現的替換成weiwen(1),第二次出現的替換成weiwen(2)
public static int i = 0;
static void Main(string[] args)
{
string source = "##arwen***&&arwen###";
string pattern = "arwen";
string result;
MatchEvaluator me = Replace; //聲明一個代理,並綁定一個函數.其實就相當於me是一個指向函數Replace的指標
result = Regex.Replace(source, pattern, me); //把me也可以看成是函數Replace當參數傳進去
Console.WriteLine(result); //結果是"##weiwen(1)***&&weiwen(2)###";
}
public static string Replace(Match ma)
{
if (ma.Success)
{
i++;
return "weiwen" +string.Format("({0})",i);
}
return "NULL";
}
不過看了上面的代碼還是有點暈,不知道它從頭到尾是以什麼樣的順序什麼樣的邏輯執行過來的.
result = Regex.Replace(source, pattern, me);//這看起來就一句話,其實它裡面有很多複雜的操作,並且還有迴圈多次的操作
//首先會去這樣匹配 MatchCollection matchs = Regex.Matches(source, pattern);由於會匹配到兩個arwen.所以集合matchs中會有兩個值
//matchs[0].Value = "arwen"; matchs[1] = "arwen". 然後會用for(int i = 0;i < matchs.matchs.Count;i++)
//{
// matchs[i] = Replace(matchs[i]); //這是這裡把字串替換了
//}
當然我上面說的只是大概解釋下背後的大概流程應該是什麼樣的.
實現使用時我們只會用到result = Regex.Replace(source, pattern, me);這一句就OK了
例子2
上面說的是匹配相同的字元.那再舉個例子說下匹配到不同的內容並做不同的替換
假如字串中有數字2則替換成GOD,有數字3則替換成HELL.
string source = "aa2bb3cc";
string pattern = @"\d";
string result;
MatchEvaluator me = Replace;
result = Regex.Replace(source, pattern, me);
Console.WriteLine(result); //結果是aaGODbbHELLcc
public static string Replace(Match ma)
{
switch (ma.Value)
{
case "2":
return "GOD";
break;
case "3":
return "HELL";
break;
default:
return "NULL";
break;
}
}