與MVP的對決!?怎麼寫比較好
p.s
滅個火,因為之前發的文太多人誤以為我指的是我老闆,所以把關鍵字改掉。
其實我指的是坐我旁邊一個愛考我的同事啦。
--------------------------------------------------------------------------------------------------------
今天上班上到晚上八點多,快下班時,坐我隔壁的同事突然問我一個問題
:如果有一個字串,長這個樣子
string s="aaa=bbb,cc=dd,ttt=pppp,xxx=tgdt";
內容不重要,格式大概就是一個key 一個value,然後用' , '隔開
問我如果我要把這串字串塞進一個Dictionary<TKey, TValue>裡,我會怎麼做
我想了一下,既然要篩字串,就用Regular Expression吧
順便介紹一下 Expresso 這套軟體吧!
基本上這套就是可以幫助你寫出鬼畫符般的Regular Expression,還提供測試跟Replace的結果給你看
還有一堆有的沒的功能,由於是英文,所以我也不太會用。都拿來當作驗證規則寫的對不對而已。
馬上就用這套軟體,寫出我要的規則吧
規則也十分的簡單,不用三分鐘就寫完了
稍微講一下規則怎麼寫好了 看這個字串 "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();
}
}
}
結果不錯,有達到我要的
於是就跟同事說我做好了。
只見同事輕笑了兩聲,
說:殺雞焉用牛刀,用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 我買了一台新筆電,打算每周多用點時間在外面看看書、寫部落(不然回家很墮落),所以如果我
以後發文篇數沒有變多的話,歡迎大家罵我只是單純的想敗家還找那麼多藉口~