C#(.NET)模板字符串占位符正则表达式替换(类EL表达式)
因为需要自己写一个日志记录工具,文件名可以在配置文件中配置,能够支持模板替换自定义文件名,所以在此将模板字符串占位符替换的源代码贴出,以备后忘。
这个模板字符串占位符替换还有一些不足,性能上的优化,以及将SafeMap拓展支持JSON字符串创建,以减轻使用难度。
#region << 版 本 注 释 >>
/*----------------------------------------------------------------
* 项目名称 :WS.Text
* 项目描述 :文本格式化
* 类 名 称 :Format
* 类 描 述 :字符串格式化
* 所在的域 :
* 命名空间 :WS.Text
* 机器名称 :
* CLR 版本 :4.0.30319.42000
* 作 者 :wagsn
* 创建时间 :2018/11/22 1:27:26
* 更新时间 :2018/11/28 9:26:00
* 版 本 号 :v1.0.0.1
//----------------------------------------------------------------*/
#endregion
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace WS.Text
{
/// <summary>
/// 字符串格式化
/// </summary>
public static class Format
{
/// <summary>
/// 测试模板替换,vs2017->鼠标方法名->右键交互执行->需要把那些依赖的方法和using都交互执行过才行
/// </summary>
public static void Test()
{
SafeMap<object> map = new SafeMap<object>();
map["username"] = "wagsn";
map["password"] = "123456";
Console.WriteLine(ReplacePlaceholder("${username}: ${password}", map));
// 输出结果为:wagsn: 123456
}
/// <summary>
/// 占位符替换: ${TagName} -> TagValue
/// 例:"${year}-${month}-${day}" -> "2018-11-28"
/// </summary>
/// <param name="template">模板字符串</param>
/// <returns>替换后的字符串</returns>
public static string ReplacePlaceholder<TValue>(string template, SafeMap<TValue> pairs)
{
string result = new string(template.ToCharArray());
// TODO 需要优化为,匹配到 \$\{(\S*?)\} 后按照匹配到的内容作为Key在Map中寻找Value替换
foreach(var key in pairs.Keys)
{
Regex regex = new Regex(@"\$\{"+key+@"\}");
result =regex.Replace(result, pairs[key].ToString());
}
return result;
}
/// <summary>
/// 安全的映射表,不存在的Key返回默认的Value,string类型将返回string.Empty("")
/// </summary>
public class SafeMap<TValue>
{
/// <summary>
/// 获取Keys
/// </summary>
public IEnumerable<string> Keys
{
get
{
return kvs.Keys;
}
}
private Dictionary<string, TValue> kvs = new Dictionary<string, TValue>();
/// <summary>
/// 索引器
/// </summary>
/// <param name="index">索引</param>
/// <returns>值</returns>
public TValue this[string index]
{
get
{
return Get(index);
}
set
{
Set(index, value);
}
}
/// <summary>
/// 获取Key对应的值
/// </summary>
/// <param name="index">索引</param>
/// <returns>值</returns>
public TValue Get(string index)
{
if (kvs.ContainsKey(index))
{
return kvs[index];
}
else
{
return default(TValue);
}
}
/// <summary>
/// 设置Key对应的值
/// </summary>
/// <param name="index">索引</param>
/// <param name="value">值</param>
public void Set(string index, TValue value)
{
kvs[index] = value;
}
}
}