一問題多種解!?怎麼寫比較好

與MVP的對決!?怎麼寫比較好

p.s

滅個火,因為之前發的文太多人誤以為我指的是我老闆,所以把關鍵字改掉。

其實我指的是坐我旁邊一個愛考我的同事啦。

--------------------------------------------------------------------------------------------------------

今天上班上到晚上八點多,快下班時,坐我隔壁的同事突然問我一個問題

:如果有一個字串,長這個樣子

string s="aaa=bbb,cc=dd,ttt=pppp,xxx=tgdt";

內容不重要,格式大概就是一個key 一個value,然後用'  ,  '隔開

問我如果我要把這串字串塞進一個Dictionary<TKey, TValue>裡,我會怎麼做

我想了一下,既然要篩字串,就用Regular Expression吧

順便介紹一下 Expresso 這套軟體吧!

基本上這套就是可以幫助你寫出鬼畫符般的Regular Expression,還提供測試跟Replace的結果給你看

還有一堆有的沒的功能,由於是英文,所以我也不太會用。都拿來當作驗證規則寫的對不對而已。

bb86582377ea462ba0c11d627afd1db8

 

馬上就用這套軟體,寫出我要的規則吧

規則也十分的簡單,不用三分鐘就寫完了

9bde3f190db245aaa91059123f0e706c

稍微講一下規則怎麼寫好了 看這個字串  "aaa=bbb,cc=dd,ttt=pppp,xxx=tgdt"

"一串英文" 加上 "等號" 加上 "一串英文"   這樣是我們要的一組資料

所以呢

一串英文是  \w* => 不固定數量的文字

等號是  \s*[=]\s*  =>  等號,為了安全起見,前後都加上不固定數量的空白

後面一樣

群組的話,就是用  ( ?<自訂名稱>   規則  )

所以前面那串英文我名稱定為key,寫法  (?<key>\w*)

後面那串命為value,寫法(?<value>\w*)

就完成啦。

確定可以篩出來之後,再來是程式的部分

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            string s = "aaa=bbb,cc=dd,ttt=pppp,xxx=tgdt";

            string regex = @"(?<key>\w*)\s*[=]\s*(?<value>\w*)";

            Dictionary<string, string> data = new Dictionary<string, string>();

            //比對,將篩選成功的塞進Dictionary
            foreach (Match m in Regex.Matches(s, regex))
            {
                data.Add(m.Groups["key"].ToString(), m.Groups["value"].ToString());

                //data.Add(m.Groups[1].ToString(), m.Groups[2].ToString());
                //這樣寫也可以,不過記得是從1開始算,0的話是不分群組的結果 
                //例如:aaa=bbb
            }
            

            //印出Dictionary的結果
            foreach (var i in data)
            {
                Console.WriteLine("{0}---{1}", i.Key, i.Value);
            }

            Console.ReadKey();

        }
    }
}

結果不錯,有達到我要的

08bc5769c44640ef8efdcb7623a074fb

於是就跟同事說我做好了。

 

只見同事輕笑了兩聲,

說:殺雞焉用牛刀,用Regular Expression太累了,而且我也不會(....|||)

他說用Linq就好。因此看看他寫的Code吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            string s = "aaa=bbb,cc=dd,ttt=pppp,xxx=tgdt";

            Dictionary<string, string> data = s.Split(',')
					.Select(p => new { temp = p.Split('=') })
					.ToDictionary(i => i.temp[0], j => j.temp[1]);

            //印出Dictionary的結果
            foreach (var i in data)
            {
                Console.WriteLine("{0}---{1}", i.Key, i.Value);
            }

            Console.ReadKey();

        }
    }
}

簡單的說,就是先把字串用','拆開,然後再用'='拆開

接著用ToDictionary把值放進去,就結束了,一行搞定,也不用複雜的邏輯

不過這次的題目是因為字串算乾淨,而且key的值也沒有重複,所以用他的方法較快

但哪天如果有更亂的字串,或是更奇怪的條件的話,Regular Expression還是很好用的啦!

 

 

p.s 我買了一台新筆電,打算每周多用點時間在外面看看書、寫部落(不然回家很墮落),所以如果我

     以後發文篇數沒有變多的話,歡迎大家罵我只是單純的想敗家還找那麼多藉口~