天天看點

C#記事本-查找與替換 這是我在C#專欄的問貼: 請教C#類似于VS的查找功能

看了網上關于記事本的查找替換很多,但都沒有達到我想要的結果,然後自己學習總結了以下的方法

統計字元串(漢字,字母,數字,字元)

先上效果圖

C#記事本-查找與替換 這是我在C#專欄的問貼: 請教C#類似于VS的查找功能
C#記事本-查找與替換 這是我在C#專欄的問貼: 請教C#類似于VS的查找功能

定義全局變量

        #region  =★*★*★= 〖查找替換〗的自定義變量 =★*★*★=
        /// <summary> 擷取或設定查找起始位置 </summary>
        static int Index = 0;
        /// <summary> 查找到的字元串數量 </summary>
        static int count = 0;
        /// <summary> 查找字元是否變更
        static string strE = string.Empty;
        /// <summary> 記錄原始光标位置 </summary>
        static int MemoIndex = -1;
        /// <summary> 過度字元串變量 </summary>
        static string str = string.Empty;
        /// <summary> 執行個體化富文本 </summary>
        static RichTextBox r = new RichTextBox();
        #endregion
           

向上查找

#region  =★*★*★= FindUp() 查找指定〖字元 或 字元串〗 =★*★*★=
        /// <summary>向上查找指定〖字元 或 字元串〗(不區分大小寫)<para> <para>  
        /// 參數1(rbox):内容文本框,指定為 RichTextBox 文本框類型<para>  
        /// 參數2(str):使用者指定要查找的字元串</para>  
        /// </para></para> </summary>  
        /// <param name="rbox">内容文本框,指定為 RichTextBox 文本框類型</param>  
        /// <param name="str">使用者指定要查找的字元串</param>  
        public static void FindUp(RichTextBox rtxt, string str)
        {
            if (strE != str)
            {
                rtxt.SelectionStart = rtxt.Text.Length;
                strE = str;
            }

            Index = rtxt.SelectionStart;
            Index = rtxt.Find(str, 0, Index, RichTextBoxFinds.Reverse);
            if (Index >= 0)
            {
                rtxt.SelectionStart = Index;
                rtxt.SelectionLength = str.Length;
                count++;
                rtxt.Focus();
                myColor(rtxt);//設定關鍵字為顔色
                if (Index <= 0)
                {
                    seeks(str);
                    count = 0;
                }
            }
            else if (Index < 0)
            {
                seeks(str);
                count = 0;
            }
        }
        #endregion
           

向下查找

#region  =★*★*★=  FindDown() 查找指定〖字元 或 字元串〗=★*★*★=
        /// <summary>向下 查找指定〖字元 或 字元串〗<para> </para>  
        /// 參數1(rbox):内容文本框,指定為 RichTextBox 文本框類型  <para></para>
        /// 參數2(FindStr):使用者指定要查找的字元串<para></para>
        /// 參數3(TrueFales):bool 真:限定大小寫 假:不分大小寫</summary>
        /// <param name="rbox">内容文本框,指定為 RichTextBox 文本框類型</param>  
        /// <param name="FindStr">使用者指定要查找的字元串</param>  
        /// <param name="TrueFales">bool 真:限定大小寫 假:不分大小寫</param>  
        public static void FindDown(RichTextBox rtxt, string FindStr,bool TrueFales)
        {
            if (TrueFales)
                fileFindDownMax(rtxt, FindStr);
            else
                fileFindDownMin(rtxt, FindStr);
        }
        #endregion


        #region  =★*★*★= 簡單的從上到下查找 =★*★*★=
        /// <summary>向下查找指定〖字元 或 字元串〗(限定大小寫)<para> <para>  
        /// 參數1(rbox):内容文本框,指定為 RichTextBox 文本框類型  
        /// <para>參數2(FindStr):使用者指定要查找的字元串</para>  
        /// </para></para> </summary>  
        /// <param name="rbox">内容文本框,指定為 RichTextBox 文本框類型</param>  
        /// <param name="FindStr">使用者指定要查找的字元串</param>  
        private static void FindDownmax(RichTextBox rtxt, string FindStr)
        {
            Index = rtxt.Find(FindStr, Index, RichTextBoxFinds.MatchCase);
            if (Index < 0 || Index > rtxt.Text.Length)
            {
                seeks(FindStr);
                count = 0;
                Index = 0;
            }
            else
            {
                rtxt.Select(Index, FindStr.Length);
                myColor(rtxt);//設定關鍵字為顔色
                Index += FindStr.Length;
                rtxt.Focus();
            }
        }

        /// <summary>向下查找指定〖字元 或 字元串〗(不區分大小寫)<para> <para>  
        /// 參數1(rbox):内容文本框,指定為 RichTextBox 文本框類型  
        /// <para>參數2(FindStr):使用者指定要查找的字元串</para>  
        /// </para></para> </summary>  
        /// <param name="rbox">内容文本框,指定為 RichTextBox 文本框類型</param>  
        /// <param name="FindStr">使用者指定要查找的字元串</param>  
        private static void FindDownMin(RichTextBox rtxt, string FindStr)
        {
            Index = rtxt.Find(FindStr, Index, RichTextBoxFinds.None);
            if (Index < 0 || Index > rtxt.Text.Length)
            {
                seeks(FindStr);
                count = 0;
                Index = 0;
            }
            else
            {
                rtxt.Select(Index, FindStr.Length);
                myColor(rtxt);//設定關鍵字為顔色
                Index += FindStr.Length;
                rtxt.Focus();
            }
        }
        #endregion

        //* 類似 VS 的查找方法 */
        #region  =★*★*★= 類似 VS 的查找方法 =★*★*★=
        /// <summary>  類似 VS 的查找方法(不區分大小寫向下查找)<para> </para>
        /// 參數1(txt):RichTextBox文本框<para></para>
        /// 參數2(FindString):查找字元串</summary>
        /// <param name="txt">RichTextBox文本框</param>
        /// <param name="FindString">查找字元串</param>
        private static void fileFindDownMax(RichTextBox rtxt, string FindString)
        {
            if (MemoIndex < 0)
            {
                MemoIndex = rtxt.SelectionStart;
                if (MemoIndex > 10 && MemoIndex + FindString.Length <= rtxt.Text.Length)
                {
                    str = rtxt.Text.Substring(0, MemoIndex + FindString.Length - 1);//截取光标位置 + 查找字元數 - 1 位數
                    Index = rtxt.SelectionStart;
                    r.Text = str;
                }
                else
                {
                    str = rtxt.Text;
                    r.Text = rtxt.Text;
                    Index = rtxt.SelectionStart;
                }
            }
            if (Index < str.Length - (FindString.Length - 1) && Index >= 0)
            {
                Index = r.Find(FindString, Index, RichTextBoxFinds.None);
                if (Index < 0 || Index > r.Text.Length)
                {
                    seeks(FindString);
                    count = 0;
                    Index = 0;
                    MemoIndex = -1;
                }
                else
                {
                    rtxt.Select(Index, FindString.Length);
                    myColor(rtxt);//設定關鍵字為顔色
                    rtxt.Focus();
                    count++;

                    Index += FindString.Length;
                    if (Index > str.Length - FindString.Length)
                    {
                        seeks(FindString);
                        MemoIndex = -1;
                        Index = 0;
                        count = 0;
                    }
                }
            }
            else if (Index < rtxt.Text.Length && Index >= 0)
            {
                Index = rtxt.Find(FindString, Index, RichTextBoxFinds.None);
                if (Index == -1)//(Index >= txt.Text.Length && Index <= 0)
                {
                    if (r.Text != "")
                    {
                        Index = 0; Index = r.Find(FindString, Index, RichTextBoxFinds.None);
                        if (Index < 0 || Index > r.Text.Length)
                        {
                            seeks(FindString);
                            count = 0;
                            Index = 0;
                            MemoIndex = -1;
                        }
                        else
                        {
                            rtxt.Select(Index, FindString.Length);
                            myColor(rtxt);//設定關鍵字為顔色
                            rtxt.Focus();
                            Index += FindString.Length;
                            count++;
                            if (Index > str.Length - FindString.Length)
                            {
                                seeks(FindString);
                                MemoIndex = -1;
                                Index = 0;
                                count = 0;
                            }
                        }
                    }
                    else
                    {
                        seeks(FindString);
                        MemoIndex = -1;
                        Index = 0;
                        count = 0;
                    }
                }
                else
                {
                    rtxt.Select(Index, FindString.Length);//在RichTextBox控件中搜尋關鍵字
                    Index += FindString.Length;//遞增辨別查詢關鍵字的初始長度
                    myColor(rtxt);//設定關鍵字為顔色
                    rtxt.Focus();
                    count++;
                }
            }
            else
            {
                Index = 0; Index = r.Find(FindString, Index, RichTextBoxFinds.None);
                if (Index < r.Text.Length - FindString.Length && Index >= 0)
                {
                    r.Select(Index, FindString.Length);
                    rtxt.Select(Index, FindString.Length);
                    myColor(rtxt);//設定關鍵字為顔色
                    Index += FindString.Length;//遞增辨別查詢關鍵字的初始長度
                    rtxt.Focus();
                    count++;
                }
                else
                {
                    seeks(FindString);
                    MemoIndex = -1;
                    Index = 0;
                    count = 0;
                }
            }
        }

        /// <summary>  類似 VS 的查找方法(不區分大小寫向下查找)<para> </para>
        /// 參數1(txt):RichTextBox文本框<para></para>
        /// 參數2(FindString):查找字元串</summary>
        /// <param name="txt">RichTextBox文本框</param>
        /// <param name="FindString">查找字元串</param>
        private static void fileFindDownMin(RichTextBox rtxt, string FindString)
        {
            if (MemoIndex < 0)
            {
                MemoIndex = rtxt.SelectionStart;
                if (MemoIndex > 10 && MemoIndex + FindString.Length <= rtxt.Text.Length)
                {
                    str = rtxt.Text.Substring(0, MemoIndex + FindString.Length - 1);
                    Index = rtxt.SelectionStart;
                    r.Text = str;
                }
                else
                {
                    str = rtxt.Text;
                    r.Text = rtxt.Text;
                    Index = rtxt.SelectionStart;
                }
            }
            if (Index < str.Length - (FindString.Length - 1) && Index >= 0)
            {
                Index = r.Find(FindString, Index, RichTextBoxFinds.MatchCase);
                if (Index < 0 || Index > r.Text.Length)
                {
                    seeks(FindString);
                    count = 0;
                    Index = 0;
                    MemoIndex = -1;
                }
                else
                {
                    rtxt.Select(Index, FindString.Length);
                    myColor(rtxt);//設定關鍵字為顔色
                    rtxt.Focus();
                    count++;

                    Index += FindString.Length;
                    if (Index > str.Length - FindString.Length)
                    {
                        seeks(FindString);
                        MemoIndex = -1;
                        Index = 0;
                        count = 0;
                    }
                }
            }
            else if (Index < rtxt.Text.Length && Index >= 0)
            {
                Index = rtxt.Find(FindString, Index, RichTextBoxFinds.MatchCase);
                if (Index == -1)
                {
                    if (r.Text != "")
                    {
                        Index = 0; Index = r.Find(FindString, Index, RichTextBoxFinds.MatchCase);
                        if (Index < 0 || Index > r.Text.Length)
                        {
                            seeks(FindString);
                            count = 0;
                            Index = 0;
                            MemoIndex = -1;
                        }
                        else
                        {
                            rtxt.Select(Index, FindString.Length);
                            myColor(rtxt);//設定關鍵字為顔色
                            rtxt.Focus();
                            Index += FindString.Length;
                            count++;
                            if (Index > str.Length - FindString.Length)
                            {
                                seeks(FindString);
                                MemoIndex = -1;
                                Index = 0;
                                count = 0;
                            }
                        }
                    }
                    else
                    {
                        seeks(FindString);
                        MemoIndex = -1;
                        Index = 0;
                        count = 0;
                    }
                }
                else
                {
                    rtxt.Select(Index, FindString.Length);//在RichTextBox控件中搜尋關鍵字
                    Index += FindString.Length;//遞增辨別查詢關鍵字的初始長度
                    myColor(rtxt);//設定關鍵字為顔色
                    rtxt.Focus();
                    count++;
                }
            }
            else
            {
                Index = 0; Index = r.Find(FindString, Index, RichTextBoxFinds.MatchCase);
                if (Index < r.Text.Length - FindString.Length && Index >= 0)
                {
                    r.Select(Index, FindString.Length);
                    rtxt.Select(Index, FindString.Length);
                    myColor(rtxt);//設定關鍵字為顔色
                    Index += FindString.Length;//遞增辨別查詢關鍵字的初始長度
                    rtxt.Focus();
                    count++;
                }
                else
                {
                    seeks(FindString);
                    MemoIndex = -1;
                    Index = 0;
                    count = 0;
                }
            }
        }
        #endregion
           

替換 與 全部替換(功能不是很全)

#region  =★*★*★= 〖替換〗與〖全部替換〗 =★*★*★=

        #region  =★*★*★= 單次替換字元串 =★*★*★=
        /// <summary> 替換 </summary>
        /// <param name="rtxt">RichTextBox</param>
        /// <param name="FindString">查找字元串</param>
        /// <param name="ReplString">替換字元串</param>
        /// <param name="TrueFalse">(bool值)區分大小寫<para> </para>真:區分<para></para>假:不區分</param>
        public static void replaces(RichTextBox rtxt, string FindString, string ReplString, bool TrueFalse)
        {
            string txtSt = rtxt.SelectedText;
            if (FindString.Equals(txtSt))
            {
                int fs = FindString.Length;
                int rs = ReplString.Length;
                int cs = fs - rs;
                rtxt.SelectionLength = FindString.Length;
                rtxt.SelectionColor = Color.Coral;
                rtxt.SelectedText = ReplString;//textBox2中放要替換的字元  
                rtxt.Focus();
                MemoIndex = -1;
                rtxt.SelectionStart += cs;
            }
            FindDown(rtxt, FindString, TrueFalse);
        }

        #region  =★*★*★= 替換字元串 =★*★*★=
        /// <summary>替換字元串<para> </para>  
        /// 參數1(FindString):查找的内容<para></para>  
        /// 參數2(ReplString):要替換的内容  </summary>  
        /// <param name="FindString">查找的内容</param>  
        /// <param name="ReplString">要替換的内容</param>  
        private static void replace(RichTextBox rtxt, string FindString, string ReplString)
        {
            rtxt.SelectionLength = FindString.Length;
            rtxt.SelectedText = ReplString;//textBox2中放要替換的字元  
            Index = rtxt.SelectionStart;//擷取或設定光标標明位置
        }
        #endregion
        #endregion


        #region  =★*★*★= 〖全部替換〗 =★*★*★=
        /// <summary> 全部替換<para> </para>
        /// 參數1(txt):RichTextBox 文本框<para></para>
        /// 參數2(FindString):查找字元串<para></para>
        /// 參數3(ReplString):替換字元串<para></para>
        /// 參數4(trueFales):bool 真:區分大小寫,假:不區分大小寫</summary>
        /// <param name="txt">RichTextBox 文本框</param>
        /// <param name="FindString">查找字元串</param>
        /// <param name="ReplString">替換字元串</param>
        /// <param name="trueFales">bool 真:區分大小寫,假:不區分大小寫</param>
        public static void ReplAll(RichTextBox rtxt, string FindString, string ReplString, bool trueFales)
        {
            if (trueFales)
                onDistinCase(rtxt, FindString, ReplString);
            else
                offDistinCase(rtxt, FindString, ReplString);
        }

        #region  =★*★*★= 全部替換(區分/不區分大小寫) =★*★*★=
        /// <summary> 全部替換(區分大小寫) </summary>
        /// <param name="rtxt">RichTextBox 文本框</param>
        /// <param name="FindStr">查找字元串</param>
        /// <param name="ReplStr">替換字元串</param>
        private static void onDistinCase(RichTextBox rtxt, string FindStr, string ReplStr)
        {
            while (Index >= 0 || Index <= rtxt.Text.Length)
            {
                int cot = FindStr.Length - ReplStr.Length;
                Index = rtxt.Find(FindStr, Index, RichTextBoxFinds.MatchCase);
                if (Index < 0 || Index > rtxt.Text.Length)
                {
                    DialogResult r = MessageBox.Show(string.Format("查找結束,已經為您找到{0}個結果。", count),
                          "查找結果-Mxdr溫馨提示!!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    if (r == DialogResult.Yes)
                        count = 0;
                    Index = 0;
                    break;
                }
                else
                {
                    rtxt.Select(Index, FindStr.Length);
                    replace(rtxt, FindStr, ReplStr);
                    Index += FindStr.Length;
                    count++;
                }
            }
        }

        /// <summary> 全部替換(不區分大小寫) </summary>
        /// <param name="rtxt">RichTextBox 文本框</param>
        /// <param name="FindStr">查找字元串</param>
        /// <param name="ReplStr">替換字元串</param>
        private static void offDistinCase(RichTextBox rtxt, string FindStr, string ReplStr)
        {
            while (Index >= 0 || Index <= rtxt.Text.Length)
            {
                int cot = FindStr.Length - ReplStr.Length;
                Index = rtxt.Find(FindStr, Index, RichTextBoxFinds.None);
                if (Index < 0 || Index > rtxt.Text.Length)
                {
                    DialogResult r = MessageBox.Show(string.Format("查找結束,已經為您找到{0}個結果。", count),
                          "查找結果-Mxdr溫馨提示!!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    if (r == DialogResult.Yes)
                        count = 0;
                    Index = 0;
                    break;
                }
                else
                {
                    rtxt.Select(Index, FindStr.Length);
                    replace(rtxt, FindStr, ReplStr);
                    Index += FindStr.Length;
                    count++;
                }
            }
        }
        #endregion
        #endregion

        #endregion
           

消息彈窗

#region  =★*★*★= 消息提示,提示使用者查找結果 =★*★*★=
        /// <summary> 消息提示,提示使用者查找結果<para> <para>  
        /// 參數1(str):使用者指定要查找的字元串</para></para> </summary>  
        /// <param name="str">使用者指定要查找的字元串</param>  
        public static void seeks(string str)
        {
            if (count != 0)
                MessageBox.Show(string.Format("已查找完畢,共〖{0}〗個 \"{1}\"!", count, str), "查找結果-Mxdr溫馨提示!!");
            else MessageBox.Show(string.Format("沒有查找到 \"{0}\"!", str), "查找 - Mxdr溫馨提示!");
        }
        #endregion
           

查找字元着色

#region  =★*★*★= 查找字元上色 =★*★*★=
        /// <summary> 查找字元上色 </summary>
        /// <param name="rtxt">RichTextBox</param>
        private static void myColor(RichTextBox rtxt)
        {
            rtxt.SelectionColor = Color.Coral;
        }
        #endregion
           

以上都為個人的了解,有不全的地方請各位能指點迷津

這是我在C#專欄的問貼: 請教C#類似于VS的查找功能

上一篇: 序列化介紹
下一篇: JSON &amp; PHP