/// <summary> /// 按正则里的分组进行统计 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnGroupBy_Click(object sender, EventArgs e) { Stopwatch watch = new Stopwatch(); watch.Start(); isGroupBy = true; isMatchSelect = false; var reg = RegObj; if (reg == null) { return; } List <int> groups = new List <int>(); string spliter = string.Empty; string groupOption; var groupLen = reg.GetGroupNumbers().Length; // 没有分组时,按整个匹配分组 if (sender == btnGroupBy1) { if (groupLen <= 1) { MessageBox.Show("不存在分组1"); return; } groups.Add(1); groupOption = "分组1"; } else if (sender == btnGroupBy2) { if (groupLen <= 2) { MessageBox.Show("不存在分组2"); return; } groups.Add(2); groupOption = "分组2"; } else if (sender == btnGroupBy3) { if (groupLen <= 3) { MessageBox.Show("不存在分组3"); return; } groups.Add(3); groupOption = "分组3"; } else if (groupLen == 1 || sender == btnGroupBy0) { groups.Add(0); groupOption = "整个匹配"; } else { #region 弹出窗口选择分组项 var opn = new OptionSelect(reg); if (opn.IsDisposed) { return; } opn.ShowDialog(this); groupOption = opn.ret; if (string.IsNullOrEmpty(groupOption)) { return; } #endregion var mg = Regex.Match(groupOption, @"\d+"); while (mg.Success) { groups.Add(int.Parse(mg.Value)); mg = mg.NextMatch(); } spliter = opn.spliter; groupOption = "分组" + groupOption + "(分隔符" + spliter + ")"; } Mat = reg.Match(txtOld.Text); if (!Mat.Success) { MessageBox.Show("匹配失败,没有匹配结果"); return; } chkReplace.Checked = false; var ret = new SortedList <string, int>(); while (Mat.Success) { string val = string.Empty; foreach (int gp in groups) { val += spliter + Mat.Groups[gp].Value; } if (val != string.Empty && !string.IsNullOrEmpty(spliter)) { val = val.Substring(spliter.Length);// 移除最前的分隔符 } if (ret.ContainsKey(val)) { ret[val]++; } else { ret.Add(val, 1); } Mat = Mat.NextMatch(); } // SortedList不方便根据Value排序,改成KeyValuePair数组 var ret2 = new KeyValuePair <string, int> [ret.Count]; var i = 0; foreach (var pair in ret) { ret2[i++] = pair; } // 按统计倒序排列 Array.Sort(ret2, (a, b) => - a.Value.CompareTo(b.Value)); #region 显示到DataGridView中 dgvResult.Visible = true; dgvResult.Rows.Clear(); dgvResult.Columns.Clear(); dgvResult.Columns.Add("group0", groupOption); dgvResult.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; //dgvResult.Columns[0].Width = 750; dgvResult.Columns.Add("matchTime", "匹配次数"); dgvResult.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; //dgvResult.Columns[1].Width = 80; foreach (var pair in ret2) { dgvResult.Rows.Add(pair.Key, pair.Value); } #endregion watch.Stop(); txtStatus.Text = dgvResult.Rows.Count + "个匹配, 耗时:" + watch.ElapsedMilliseconds + "毫秒"; }
/// <summary> /// 按正则里的分组进行统计 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnGroupBy_Click(object sender, EventArgs e) { Stopwatch watch = new Stopwatch(); watch.Start(); isGroupBy = true; isMatchSelect = false; var reg = RegObj; if (reg == null) return; List<int> groups = new List<int>(); string spliter = string.Empty; string groupOption; var groupLen = reg.GetGroupNumbers().Length; // 没有分组时,按整个匹配分组 if (sender == btnGroupBy1) { if (groupLen <= 1) { MessageBox.Show("不存在分组1"); return; } groups.Add(1); groupOption = "分组1"; } else if (sender == btnGroupBy2) { if (groupLen <= 2) { MessageBox.Show("不存在分组2"); return; } groups.Add(2); groupOption = "分组2"; } else if (sender == btnGroupBy3) { if (groupLen <= 3) { MessageBox.Show("不存在分组3"); return; } groups.Add(3); groupOption = "分组3"; } else if (groupLen == 1 || sender == btnGroupBy0) { groups.Add(0); groupOption = "整个匹配"; } else { #region 弹出窗口选择分组项 var opn = new OptionSelect(reg); if (opn.IsDisposed) return; opn.ShowDialog(this); groupOption = opn.ret; if (string.IsNullOrEmpty(groupOption)) return; #endregion var mg = Regex.Match(groupOption, @"\d+"); while(mg.Success) { groups.Add(int.Parse(mg.Value)); mg = mg.NextMatch(); } spliter = opn.spliter; groupOption = "分组" + groupOption + "(分隔符" + spliter + ")"; } Mat = reg.Match(txtOld.Text); if(!Mat.Success) { MessageBox.Show("匹配失败,没有匹配结果"); return; } chkReplace.Checked = false; var ret = new SortedList<string, int>(); while (Mat.Success) { string val = string.Empty; foreach (int gp in groups) { val += spliter + Mat.Groups[gp].Value; } if (val != string.Empty && !string.IsNullOrEmpty(spliter)) val = val.Substring(spliter.Length);// 移除最前的分隔符 if (ret.ContainsKey(val)) ret[val]++; else ret.Add(val, 1); Mat = Mat.NextMatch(); } // SortedList不方便根据Value排序,改成KeyValuePair数组 var ret2 = new KeyValuePair<string, int>[ret.Count]; var i = 0; foreach (var pair in ret) { ret2[i++] = pair; } // 按统计倒序排列 Array.Sort(ret2, (a, b) => -a.Value.CompareTo(b.Value)); #region 显示到DataGridView中 dgvResult.Visible = true; dgvResult.Rows.Clear(); dgvResult.Columns.Clear(); dgvResult.Columns.Add("group0", groupOption); dgvResult.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; //dgvResult.Columns[0].Width = 750; dgvResult.Columns.Add("matchTime", "匹配次数"); dgvResult.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; //dgvResult.Columns[1].Width = 80; foreach (var pair in ret2) { dgvResult.Rows.Add(pair.Key, pair.Value); } #endregion watch.Stop(); txtStatus.Text = dgvResult.Rows.Count + "个匹配, 耗时:" + watch.ElapsedMilliseconds + "毫秒"; }