正則表達式替換指定格式內容,實現類似String的Format方法(用擴展方法)


正則表達式真是個好東西

項目中遇到一個解析字符串的問題,隨便取其中一條:"Stage No[%d0-2], Head No[%d2-2], Nozzle Postion[%d4-2], Nozzle No[%d6-5], [%s20-2], PCB ID:[%x22-16], Ratio of bad nozzle error[%h38-2]"

看結構很是熟悉,這不就是和平時用的String.Format格式一個樣嗎(String.Format("帥哥{0}你好,歡迎來到{1}世界!","風過之后的晴",".NET");),但是又有點區別,用[%d0-2]占位,d表示類型是數字,s表示類型是字符串,x表示16進制數(項目實際沒有用到都是空),h和S比較幾乎一樣的(我把它當S處理)。接下來是0-2,2-2,4-2之類的,‘-’前面的數表示索引,后面的數表示長度。

隨便寫一個源字符串:12345678900000000000aa00000000000000000000000000000000000000000000000000000000000000000000000000

所以解析出來的內容應該是:Stage No12, Head No34, Nozzle Postion56, Nozzle No78900, aa, PCB ID:0, Ratio of bad nozzle error00

最開始沒有思路,網上隨便查了下用正則表達式可以完成,引用命名空間:using System.Text.RegularExpressions; Regex的靜態方法, 函數原型 public static string Replace(string input, string pattern, MatchEvaluator evaluator); 

第一個參數是源字符串,第二個是正則表達式匹配格式,第三個是函數代理,參數為Match類型,匹配的數據。

用法舉例

 1 private string FormatString(string strSource, string strContent)
 2         {
 3             int index = 0;
 4             int length = 0;
 5             string strResult = Regex.Replace(strSource, @"\[%(\w)(\d+)-(\d+)\]", m =>
 6             {
 7                 index = int.Parse(m.Groups[2].Value);
 8                 length = int.Parse(m.Groups[3].Value);
 9                 try
10                 {
11                     switch (m.Groups[1].Value)
12                     {
13                         case "d":
14                             return int.Parse(strContent.Substring(index, length)).ToString();
15                         case "s":
16                         case "h":
17                             return strContent.Substring(index, length);
18                         case "x":
19                             return Convert.ToInt32(strContent.Substring(index, length),16).ToString();
20                         default:
21                             return "";
22                             23                     }
24                 }
25                 catch
26                 {
27                     return "";
28                 }
29                 30             });
31             return strResult;
32         }
33     

m.Groups是匹配結果的參數數組m.Groups[1]代表第一個參數(\w)表示類型,m.Groups[2]代表第二個參數(\d+)表示索引,代表第三個參數(\d+)表示長度。每一次匹配到patten的時候會調用后面的委托進行替換。

我們完全可以自己實現String.Format了,用一個擴展方法MyFormat.擴展方法必須在靜態類中並引用其命名空間,因為我這里類都在一個命名空間所以不用再引用了。

類寫好后我們來比較一些結果,當然出來都是一樣的,但是擴展方法比原來使用更方便一點。

運行測試:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM