Ejemplo n.º 1
0
        /// <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 + "毫秒";
        }
Ejemplo n.º 2
0
        /// <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 + "毫秒";
        }