替換
Regex類有一個靜態的Replace方法,其實例也有一個Replace方法,這個方法很強大,因爲它可以傳入一個delegate,這樣,你可以自定義每次捕獲匹配時,如何處理捕獲的內容。
public static void Main()
{
string s = "1 12 3 5";
s = Regex.Replace(s,@"/d+",new MatchEvaluator(CorrectString),RegexOptions.Compiled|RegexOptions.IgnoreCase);
Console.WriteLine(s);
Console.ReadLine();
}
private static string CorrectString(Match match)
{
string matchValue = match.Value;
if(matchValue.Length == 1)
matchValue = "0" + matchValue;
return matchValue;
}
以上這段代碼說明了如果使用delegate MatchEvaluator 來處理正則的Match結果,該代碼返回"01 12 03 05"。Replace方法除了使用delegate來處理捕獲的Match,還可以用字符串來替換Match的結果,而用字符串來替換Match結果除了把Match結果靜態的替換成一個固定的文本外,還可以使用以下語法來更方便的實現你需要的功能:
$number | 把匹配的第number組替換成替換表達式,還有這句話怎麼寫也表達不清楚意思,還是來個例子吧: public static void Main() { string s = "1 12 3 5"; s = Regex.Replace(s,@"(/d+)(?#這個是註釋)","0$1",RegexOptions.Compiled|RegexOptions.IgnoreCase); Console.WriteLine(s); Console.ReadLine(); } 這段代碼返回的是 “01 012 03 05” 就是說,對組一的每個匹配結果都用"0$1"這個表達式來替換,"0$1"中"$1"由組1匹配的結果代入 |
${name} | 把匹配的組名爲"name"的組替換成表達式, 上例的Regex expression改成@"(?<name>/d+)(?#這個是註釋)"後面的替換式改爲"0${name}"結果是一樣的 |
$$ | 做$的轉義符,如上例表達式改成@"(?<name>/d+)(?#這個是註釋)"和"$$${name}",則結果爲"$1 $12 $3 $5" |
$& | 替換整個匹配 |
$` | 替換匹配前的字符 |
$' | 替換匹配後的字符 |
$+ | 替換最後匹配的組 |
$_ | 替換整個字符串 |
後面的選項,大家自己寫個例子體味一下。
*注,上例中的(?#這個是註釋)說明了正則的內聯註釋語法爲(?#)
表達項選項
正則表達式選項RegexOptions有如下一下選項,詳細說明請參考聯機幫助
RegexOptions枚舉值 | 內聯標誌 | 簡單說明 |
ExplicitCapture | n | 只有定義了命名或編號的組才捕獲 |
IgnoreCase | i | 不區分大小寫 |
IgnorePatternWhitespace | x | 消除模式中的非轉義空白並啓用由 # 標記的註釋。 |
MultiLine | m | 多行模式,其原理是修改了^和$的含義 |
SingleLine | s | 單行模式,和MultiLine相對應 |
這裏我提到內聯標誌,是因爲相對於用RegexOptions在new Regex時定義Regex表達式的全局選項來說,內聯標誌可以更小粒度(以組爲單位)的定義匹配選項,從而更方便表達我們的思想
語法是這樣的:(?i:expression)爲定義一個選項,(?-i:expression)爲刪除一個選項,(?i-s:expression)則定義i,刪除s,是的,我們可以一次定義很多個選項。這樣,通過內聯選項,你就可以在一個Regex中定義一個組爲匹分大小寫的,一個組不匹分大小寫的,是不是很方便呢?