2017年8月21日 星期一

C# - REGEX(Regular Expression)的運用技巧(地圖運用篇)

我寫程式寫到現在,我覺得演算法中要說最精華的,就應該是Regular Expression
Regex如果用的好,可以增進系統的效能,還可以達到程式的優化。
但其實Regex是一個不好學的東西,因為它沒有那麼的直覺,是真的需要花很多時間去了解。
下面我就來分享如何使用REGEX的技巧:

假設我們有個需求,是透過幾段字串裡面,編排出找尋位置的方法,例如下面的字串:

$MAP
  MAP "1"  1234
  MAP "2"  5678
  MAP "3"  9101 

$POSIITION 1234

  POSITION  "A2"  PARAM  "1"  "2"
  POSITION  "B4"  PARAM  "2"  "1"
  POSITION  "C1"  PARAM  "3"  "1"

$POSITION 5678

  POSITION  "D4"  PARAM  "1"  "2"
  POSITION  "E2"  PARAM  "2"  "1"
  POSITION  "F1"  PARAM  "3"  "1"

在第一行上面可以看到有一個MAP的關鍵字,它有一整行看起來很有規則的文字,然後下面的POSITION,我們就可以利用這一段的文字,來取出一些關鍵的參考:


//定義一個可變動的索引值
string num = "1";
Regex rgx = new Regex(@"\sMAP\s\s\w*""" + num + @"""\s\s\w*\s\s\w*\w*""\d""");

//然後我可以辦識的結果取出
Match match = rgx.Match(line);

if (match.Success)
{
    Console.WriteLine("Regex{0}", match.Value);

}

在上面的一段程式,透過REGEX的處理,我們可以取到一段像這樣的結果:



上面的一段@"\sMAP\s\s\w*""" + num + @"""\s\s\w*\s\s\w*\w*""\d"""

我們可以這樣解讀:

1.\sMAP\s\s:空白字元旁邊有一個MAP然後兩個空白字完。
2.\w*""" + num + @""":空白字元旁邊的"1"字元。
3.\s\s\w*\s\s\w*\w*""\d"":空白字元後面的字元。

這樣就可以搜尋到相關的字串,然後我們就可以把字串批配到另一段我們想要的參數上:

//如果找到符合的Keyword,就進入判斷
if (match.Success)
{
     string keysearch = match.Value;

        //透過REGEX取出想要的值
     rgx = new Regex(@"\sMAP\s\w*\""" + num + @"""\s\s");

        //把不要的部分取代
     string result = rgx.Replace(keysearch, "");
}

這樣就會找到我們要參數


我們就可以把剛剛的規則透過Function包起來,然後再去批對POSITION找到我們想要的結果。
這種技巧其實可以運用在很多的開發層面上,尤其是搜尋引擎,熟練這樣的寫法,可以寫出令人讚嘆的程式喔。

下面是我的範例下載,有興趣可以下載來研究看看:



https://code.msdn.microsoft.com/C-REGEX-Regular-Expression-a72e0208




-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言