/// <summary> /// 审查内容 /// </summary> /// <param name="内容">待审查的内容</param> /// <param name="生成输出明细">指示是否在生成的报告中包含输出明细</param> /// <returns>报告</returns> public 报告 审查(string 内容, bool 生成输出明细) { if (!内容.验证有效性()) return null; #region 初始化 //最高评分 int ms = 0; //累计评分 int cs = 0; //最高精确评分 double rms = 0; //最高累计评分 double rcs = 0; //精确度列表 List<double> ad = new List<double>(); //输出明细 var outlist = new ObservableCollection<匹配明细>(); //捕获词语累计长度 var getstr = 0; //当前处理索引位置 var nowindex = 0; var st = new List<触发记录>(); var ed = new List<触发记录>(); #endregion #region 检测首尾字符匹配情况 for (int i = 0; i < 内容.Length; i++) { if (首字符.Contains(内容[i])) st.Add(new 触发记录() { 索引位置 = i, 字符 = 内容[i] }); if (尾字符.Contains(内容[i])) ed.Insert(0, new 触发记录() { 索引位置 = i, 字符 = 内容[i] }); } #endregion #region 根据首尾匹配列表做进一步处理 foreach (触发记录 起始字符 in st) { if (nowindex > 起始字符.索引位置) continue; var 起始字符1 = 起始字符; foreach (触发记录 结束字符 in ed.Where(f => f.索引位置 >= 起始字符1.索引位置 && f.索引位置 <= 起始字符1.索引位置 + 最大长度)) { var key = 起始字符.字符.ToString() + 结束字符.字符; if (规则.Keys.Contains(key) && 规则[key].获取最大长度() >= 结束字符.索引位置 - 起始字符.索引位置) { var 结束字符1 = 结束字符; var 起始字符2 = 起始字符; foreach (规则 检测规则 in 规则[key].Where(f => 结束字符1.索引位置 - 起始字符2.索引位置 + 1 <= f.最大长度)) { var s = 内容.Substring(起始字符.索引位置, 结束字符.索引位置 - 起始字符.索引位置 + 1); //string.Format("[{1}-{2}] {0} : {3}",s,起始字符.字符,结束字符.字符,检测规则.表达式).调试输出(); //处理 if (检测规则.获取正则表达式对象().IsMatch(s)) { cs += 检测规则.分值; ms = Math.Max(ms, 检测规则.分值); var d = 检测规则.计算精确度(s.Length); ad.Add(d); var t = 检测规则.计算精确分值(d); rcs += t; rms = Math.Max(rms, t); getstr += s.Length; if (生成输出明细) outlist.Add(new 匹配明细 { 应用规则 = 检测规则, 索引位置 = 起始字符.索引位置, 原文 = s, 精确分值 = t, 精确度 = d, 类目序号 = 类目列表.IndexOf(检测规则.类目) }); nowindex = 结束字符.索引位置 + 1; goto end; } } } } end: continue; } #endregion #region 赋值 var obj = new 报告() { 输入内容 = 内容, 最高评分 = ms, 累计评分 = cs, 最高精确评分 = rms, 累计精确评分 = rcs, 输出明细 = outlist, 捕获比例 = getstr * 1.0 / 内容.Length, 平均精确度 = ad.Count > 0 ? ad.Average() : 0 }; return obj; #endregion }
/// <summary> /// 审查内容 /// </summary> /// <param name="内容">待审查的内容</param> /// <param name="生成输出明细">指示是否在生成的报告中包含输出明细</param> /// <returns>报告</returns> public 报告 审查(string 内容, bool 生成输出明细) { if (!内容.验证有效性()) { return(null); } #region 初始化 //最高评分 int ms = 0; //累计评分 int cs = 0; //最高精确评分 double rms = 0; //最高累计评分 double rcs = 0; //精确度列表 List <double> ad = new List <double>(); //输出明细 var outlist = new ObservableCollection <匹配明细>(); //捕获词语累计长度 var getstr = 0; //当前处理索引位置 var nowindex = 0; var st = new List <触发记录>(); var ed = new List <触发记录>(); #endregion #region 检测首尾字符匹配情况 for (int i = 0; i < 内容.Length; i++) { if (首字符.Contains(内容[i])) { st.Add(new 触发记录() { 索引位置 = i, 字符 = 内容[i] }); } if (尾字符.Contains(内容[i])) { ed.Insert(0, new 触发记录() { 索引位置 = i, 字符 = 内容[i] }); } } #endregion #region 根据首尾匹配列表做进一步处理 foreach (触发记录 起始字符 in st) { if (nowindex > 起始字符.索引位置) { continue; } var 起始字符1 = 起始字符; foreach (触发记录 结束字符 in ed.Where(f => f.索引位置 >= 起始字符1.索引位置 && f.索引位置 <= 起始字符1.索引位置 + 最大长度)) { var key = 起始字符.字符.ToString() + 结束字符.字符; if (规则.Keys.Contains(key) && 规则[key].获取最大长度() >= 结束字符.索引位置 - 起始字符.索引位置) { var 结束字符1 = 结束字符; var 起始字符2 = 起始字符; foreach (规则 检测规则 in 规则[key].Where(f => 结束字符1.索引位置 - 起始字符2.索引位置 + 1 <= f.最大长度)) { var s = 内容.Substring(起始字符.索引位置, 结束字符.索引位置 - 起始字符.索引位置 + 1); //string.Format("[{1}-{2}] {0} : {3}",s,起始字符.字符,结束字符.字符,检测规则.表达式).调试输出(); //处理 if (检测规则.获取正则表达式对象().IsMatch(s)) { cs += 检测规则.分值; ms = Math.Max(ms, 检测规则.分值); var d = 检测规则.计算精确度(s.Length); ad.Add(d); var t = 检测规则.计算精确分值(d); rcs += t; rms = Math.Max(rms, t); getstr += s.Length; if (生成输出明细) { outlist.Add(new 匹配明细 { 应用规则 = 检测规则, 索引位置 = 起始字符.索引位置, 原文 = s, 精确分值 = t, 精确度 = d, 类目序号 = 类目列表.IndexOf(检测规则.类目) }); } nowindex = 结束字符.索引位置 + 1; goto end; } } } } end : continue; } #endregion #region 赋值 var obj = new 报告() { 输入内容 = 内容, 最高评分 = ms, 累计评分 = cs, 最高精确评分 = rms, 累计精确评分 = rcs, 输出明细 = outlist, 捕获比例 = getstr * 1.0 / 内容.Length, 平均精确度 = ad.Count > 0 ? ad.Average() : 0 }; return(obj); #endregion }