[Memo]使用Trim(Char[])要注意的地方
前言
今天碰到一個小小的需求,我們直接來看簡化後的程式碼:
var content = @"Joey:Joey的content";
var pattern = @"Joey:";
//希望得到的結果是Joey的content
實作
我們希望得到的結果,是將開頭的『Joey:』拔掉,得到『Joey的Content』,當下很直覺的就是用TrimStart()去做
var content = @"Joey:Joey的content";
var pattern = @"Joey:";
var result = content.TrimStart(pattern.ToCharArray());
//result的值= 的content
出來的結果,得到的卻是『的Content』,連我要的『Joey』都被拔掉了。
問題原因
原因是TrimStart的參數為CharArray,當我們需求是用string,而不是用CharArray思考時,就很容易不小心把Trim()用錯地方。
當我們為了使用TrimStart(),而將"Joey:".ToCharArray()後,字串就變成{'J', 'o', 'e', 'y', ':'},接著TrimStart的行為是從字串的開頭字元,來比較這個Char有沒有在CharArray中,若有,則移掉,直到比較字元不在CharArray中停止。
所以,我們希望得到的『Joey的content』,前面的『Joey』當然也就被移掉了。
改使用Regular Expression
原本想說這麼簡單的需求,不想用到Regular Expression,不過為了之後的彈性,還是改用Regex.Replace來做。
var content = @"Joey:Joey的content";
var pattern = @"Joey:";
var result = Regex.Replace(content, "^" + pattern, string.Empty);
^代表開頭,也就是我要將content裡面,開頭為pattern這個值,取代成string.Empty。
結論
魔鬼都藏在細節中啊,memo一下給自己一個警惕。希望不要有其他朋友跟我一樣傻傻的就給它Trim()下去了。
blog 與課程更新內容,請前往新站位置:http://tdd.best/