码迷,mamicode.com
首页 > 其他好文 > 详细

文本字符串逐个查找

时间:2021-05-24 07:36:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:dsc   rtb   显示   void   als   cti   ==   pre   sele   

功能: 逐个匹配出文本中所需的字符串,并高亮显示

            public class SchNxter
            {
                #region 

                #region par

                Color fntClr;
                Color bakClr;

                Color sltClr = Color.Pink;
                Color sltBakClr = Color.Azure;

                int mchIdx;
                int schLen;
                int txtLen = 0;
                string txt;
                string sch;
                string tmp;
                bool mched = false;
                char chri, chrj;
                List<int> mchIdxL = new List<int>();
                int mchCnt = 0;
                RichTextBox rtb = null;
                bool endSch = false;

                #endregion

                #region 

                /// <summary>
                /// 
                /// </summary>
                /// <param name="sltClr">选中前景色</param>
                /// <param name="sltBakClr">选中背景色</param>
                public SchNxter(Color sltClr, Color sltBakClr)
                {
                    this.sltClr = sltClr;
                    this.sltBakClr = sltBakClr;
                }
                /// <summary>
                /// 逐个向下搜索
                /// </summary>
                /// <param name="rtb"></param>
                /// <param name="sch">要查询的字符串</param>
                /// <param name="schEnd">是否已查询至结尾</param>
                public void SchNxt(RichTextBox rtb, string sch, out int mchingCnt, out bool schEnd)
                {
                    schEnd = false;
                    mchingCnt = 0;

                    if (sch == "")
                        return;

                    if (sch != this.sch || rtb.TextLength != txtLen)
                    {
                        BakSltClr(rtb);
                        mched = false;
                        endSch = false;
                    }
                    else if (this.rtb.Name != rtb.Name)
                    {
                        BakSltClr(this.rtb);
                        mched = false;
                        endSch = false;
                    }
                    else if (rtb.Text != txt)
                    {
                        BakSltClr(rtb);
                        mched = false;
                        endSch = false;
                    }
                    else if (endSch)
                    {
                        if (this.sch == sch)
                        {
                            schEnd = true;
                            return;
                        }
                        endSch = false;
                    }

                    if (!mched)
                        IniClr(rtb, sch);
                    SchNxt(rtb,out mchingCnt, out schEnd);
                }

                #endregion

                #region 

                /// <summary>
                /// 初始化颜色,参数...
                /// </summary>
                /// <param name="rtb"></param>
                /// <param name="sch"></param>
                private void IniClr(RichTextBox rtb, string sch)
                {
                    mchIdx = 0;

                    fntClr = rtb.ForeColor;
                    bakClr = rtb.BackColor;

                    schLen = sch.Length;

                    txt = rtb.Text;
                    txtLen = txt.Length;

                    rtb.SelectionBackColor = sltBakClr;
                    rtb.SelectionColor = sltClr;
                    //MessageBox.Show(mchIdx + "," + rtb.SelectionColor.Name + "," + rtb.SelectionBackColor.Name);


                    this.sch = sch;
                    this.rtb = rtb;
                }
                private void SchNxt(RichTextBox rtb, out int mchingCnt, out bool schEnd)
                {
                    schEnd = false;
                    mchingCnt = 0;

                    tmp = "";
                    int j = 0;
                    chrj = sch[j];

                    int i = mchIdx;
                    //MessageBox.Show(mchIdx + "," + rtb.SelectionColor.Name + "," + rtb.SelectionBackColor.Name);
                    for (; i < txtLen; i++)
                    {
                        chri = txt[i];
                        if (chrj == chri)
                        {
                            tmp += chri;
                            j++;
                            if (j == schLen)
                            {
                                i++;
                                i -= j;

                                rtb.Select(i, j);
                                rtb.ScrollToCaret();

                                rtb.SelectionBackColor = sltBakClr;
                                rtb.SelectionColor = sltClr;

                                //_mchIdx = i;
                                mchIdxL.Add(i);

                                mchCnt++;
                                mchingCnt=mchCnt;

                                mchIdx = i + j;
                                tmp = "";
                                j = 0;
                                mched = true;

                                return;
                            }
                            else
                                chrj = sch[j];
                        }
                        else
                        {
                            if (j > 0)
                            {
                                i++;
                                i -= j;

                                tmp = "";
                                j = 0;
                                chrj = sch[j];
                            }
                        }
                    }
                    mchIdx = i;
                    mched = false;
                    schEnd = true;
                    endSch = true;
                }
                /// <summary>
                /// 还原之前选中的项字色
                /// </summary>
                public void BakSltClr()
                {
                    if (mchCnt < 1)
                        return;

                    BakSltClr(this.rtb);
                }
                /// <summary>
                /// 还原之前选中的项字色
                /// </summary>
                /// <param name="rtb"></param>
                private void BakSltClr(RichTextBox rtb)
                {
                    if (mchCnt < 1)
                        return;

                    for (int i = 0; i < mchCnt; i++)
                    {
                        mchIdx = mchIdxL[i];
                        rtb.Select(mchIdx, schLen);

                        rtb.SelectionBackColor = bakClr;
                        rtb.SelectionColor = fntClr;
                    }
                    rtb.Select(0, 0);
                    mchIdxL.Clear();
                    mchCnt = 0;
                }

                #endregion

                #endregion
            }

  

交流 QQ : 2412366909@qq.com

手机号码:177-7499-4428

注:本人使用过程中暂未发现造成存取不正确的问题

文本字符串逐个查找

标签:dsc   rtb   显示   void   als   cti   ==   pre   sele   

原文地址:https://www.cnblogs.com/grCod/p/14763872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!