.NETRegex使用進階技巧之替換類

來源:互聯網
上載者:User
進階|技巧|正則

  因為.net的基本正則文法和Perl5基本相同,所以基本文法你可以去下載一下M$的JS協助文檔,上面有詳細的說明\d表示什麼,{,5}表示什麼,\[表示什麼……,這裡我只想提醒大家一點,為了避免和反向引用相衝突,在你用\nn表示八進位的ASCII碼時,請在\後加0,就是說,\40在表示ASCII碼時,請這樣寫\040。

  替換

  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"
$&   替換整個匹配
$`   替換匹配前的字元
$'   替換匹配後的字元
$+   替換最後匹配的組
$_   替換整個字串
  
  後面的選項,大家自己寫個例子體味一下。

  *注,上例中的(?#這個是注釋)說明了正則的內聯注釋文法為(?#)

   表達項選項

  Regex選項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中定義一個組為匹分大小寫,一個組不匹分大小寫,是不是很方便呢?



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.