正則表達式之匹配替換


   最近做word腳注用到了正則表達式的匹配替換功能。我提取rtf字符串中書簽的名稱,更改名稱后,再替換到字符串中。看代碼:

 1                var range = fd_Field.Result.Footnotes[1].Range;
18                str_Content = Regex.Replace(str_Content, @"\\bkmk(start|end) _(\w+)}", "\\bkmk$1 _$2_" + fid + "}", RegexOptions.Multiline);
19                  
20                 PasteByClipboard(range, str_Content);
21 
22                 var maches=Regex.Matches(str_Content, @"\\bkmkstart _(\w+)}", RegexOptions.Multiline);
23 
24                 for (int i = 1; i <= range.Paragraphs.Count; i++)
25                 {
26                     if (maches.Count > 0)
27                     {
28                         if (maches[i - 1].Success)
29                         {
30 
31                             if (maches[i - 1].Groups.Count > 0)
32                             {
33                                 range.Paragraphs[i].ID = maches[i - 1].Groups[1].Value;
34                             }
35                         }
36                     }
37                 }

      代碼解釋:str_Content中存儲的是rtf格式的字符串,字符串中有word書簽的定義,\v\bkmkstart _nf8f0c1a4cb18b4a8cae0338d4923c5cc1} 這是書簽的開始位置,\v\bkmkend _nf8f0c1a4cb18b4a8cae0338d4923c5cc1}\par}, 這是書簽的結束位置。\v表示書簽的名稱是隱藏的。第18行的黃色部分是正則表達式,綠色部分是要替換的內容,正則匹配書簽開始和結束的名稱,然后修改名稱並替換。(\w+)匹配的是紅色背景的部分。圓括號是正則表達式中的分組捕獲。再看看替換的部分,\\bkmk$1 _$2_" + fid + "},$1引用第一個捕獲分組,$2引用第二個捕獲分組。fid是程序中的一個變量,表示域Id,這是一個string類型,它從域的Id變化而來。

     從程序的第22行開始到結束,用正則  \\bkmkstart _(\w+)} 匹配修改后的書簽名稱,並把它作為rtf段落的Id值。這一段展示了程序如何讀取分組捕獲的值。Groups[0],存放的是整個正則匹配的結果,Groups[1],存放的是第一個分組匹配的結果。因此要取分組匹配的結果,從1開始。

      正則的分組匹配替換功能的強大是毋庸置疑的,它使得程序變得簡潔,但是仍然能滿足我們各種需求。任何一種強大的技術好比一把鋒利的劍,用好了事半功倍,用不好了,后患無窮。例如,我要用正則匹配連續的自然數。1,3,4,5,8 ,比如我要捕獲3,4,5,用正則該怎么寫呢?研究了半天,覺得無從下手,反而用程序實現起來簡單的多。碰到字符串的處理,一些比較復雜的處理,首先想想正則能不能派上用場。學以致用,這是我學習技術的最大的快樂。


免責聲明!

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



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