我們在程式寫作的時候的時候,偶爾會遇到需要處理樣板的情況,例如:
Hi! XXX您好,您X月的贍養管理費未繳,請盡速繳納...
作為程式設計師,你一定有很多種方法完成這項工作,可能直接用 string 去加出來,也可能用 StringBuilder 做。當然囉!這邊要展示的就是利用 Regex.Replace,參考的程式碼如下:
class Program
{
static void Main(string[] args)
{
string template, result;
// 匿名物件
template = "Hi! [Name]您好,您[Month]月的管理費未繳,請盡速繳納...";
var userObject = new { Name = "Nobody", Month = "五" };
result = template.TemplateSubstitute(userObject);
Console.WriteLine(result); //Hi! Nobody您好,您五月的管理費未繳,請盡速繳納...
// 使用任意物件(讀取屬性並置換)
template = "今天是西元[Year]年[Month]月[Day]日";
result = template.TemplateSubstitute(DateTime.Now);
Console.WriteLine(result); //今天是西元2010年10月12日
}
}
public static class StringExtension
{
public static string TemplateSubstitute(this string input, object data)
{
var type = data.GetType();
return Regex.Replace(input, @"\[(\w+)\]", m =>
{
var name = m.Groups[1].Value;
var prop = type.GetProperty(name);
if (prop != null)
{
// 找到屬性,傳回屬性值執行字串替換
return prop.GetValue(data, null).ToString();
}
else
{
// 在物件中找不到符合名稱的屬性,回傳原值不處理
return m.Value;
}
});
}
}
範例中使用 Extension method 擴充 String 提供一個 TemplateSubstitute 方法,在這個方法中利用 Regex.Replace 尋找符合樣板規格的 [ ] 區塊,並提供一個 lambda 給 Regex.Replace 作為回呼(Callback),重要的是使用這個方法不需要自行處理字串的組合,或是多次呼叫 Regex.Replace 取得最後的結果,而只要在 lambda 中回傳我要替代的內容就可以囉,很棒吧!
參考資料
沒有留言:
張貼留言