C#(.NET)模板字符串占位符正则表达式替换(EL表达式)

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值