/// <summary> /// 表达式解析 /// </summary> /// <param name="template"></param> /// <param name="pairs"></param> /// <returns></returns> public static string Parse(string template, SafeMap <object> pairs, ELOption option = default(ELOption)) { string result = new string(template.ToCharArray()); // 忽略不匹配项 if (option.Ignore) { // 需要优化为,匹配到 \$\{\S*?\} 后按照匹配到的内容作为Key在Map中寻找Value替换 foreach (var key in pairs.Keys) { Regex regex = new Regex(@"\$\{" + key + @"\}"); // 如果Key也是正则表达式?? result = regex.Replace(result, pairs[key].ToString()); result = regex.Replace(result, new MatchEvaluator(m => pairs.ContainsKey(key) ? pairs.UnSafeGet(key).ToString() : m.Groups[1].Value)); // ?? 这里的m. m.Groups[1] 难道指的是一个匹配项,而不是所有匹配项 } } // 将未找到匹配项的占位符删除 else { // 需要优化为,匹配到 \$\{\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> /// 表达式解析 /// 默认边界符:${ } /// </summary> /// <param name="input">模板字符串</param> /// <param name="entity">键值对</param> /// <returns></returns> public static string Parse(string input, object entity, ELOption option = default(ELOption)) { // 通过反射key做字段名 var pairs = new Dictionary <string, object>(); foreach (System.Reflection.PropertyInfo prop in entity.GetType().GetProperties()) { pairs[prop.Name] = prop.GetValue(entity); } return(Parse(input, pairs, @"\$\{", @"\}", option)); }
/// <summary> /// 表达式解析 /// 输入边界符:left rigth /// {Input:"${Who} ${Do} ${What}",KVs:{"Who":"Zhangsan","Do":"to eat","What":"an Apple"}}=>"Zhangsan to eat an Apple" /// http://www.runoob.com/csharp/csharp-regular-expressions.html /// </summary> /// <param name="input">模板字符串</param> /// <param name="pairs">键值对</param> /// <param name="leftReg">占位符左标识正则</param> /// <param name="rightReg">占位符右标识正则</param> /// <returns></returns> public static string Parse(string input, Dictionary <string, object> pairs, string leftReg, string rightReg, ELOption option = default(ELOption)) { // left right 作为匹配字符串要正则表达式转义 // @"(\$\{)(\w+)(\})" Regex regex = new Regex($"({leftReg}){@"(\w+)"}({rightReg})"); // 忽略不匹配项 key不存在保留${key} if (option.Ignore) { return(regex.Replace(input, new MatchEvaluator(m => pairs.ContainsKey(m.Groups[2].ToString()) ? pairs[m.Groups[2].ToString()].ToString() : m.Value))); } // 将未找到匹配项值的占位符被删除 else { // 这里的m. m.Groups[2]指的是第二个分组(1-9) return(regex.Replace(input, new MatchEvaluator(m => pairs.ContainsKey(m.Groups[2].ToString()) ? pairs[m.Groups[2].ToString()].ToString() : ""))); } }
/// <summary> /// 表达式解析 /// 默认边界符:${ } /// </summary> /// <param name="input">模板字符串</param> /// <param name="pairs">键值对</param> /// <returns></returns> public static string Parse(string input, Dictionary <string, object> pairs, ELOption option = default(ELOption)) { return(Parse(input, pairs, @"\$\{", @"\}", option)); }