C#实现记事本查找与替换功能

作者:茗香淡然 时间:2022-03-24 00:20:58 

看了网上关于记事本的查找替换很多,但都没有达到我想要的结果,然后自己学习总结了以下的方法:

统计字符串(汉字,字母,数字,字符)

先上效果图

C#实现记事本查找与替换功能C#实现记事本查找与替换功能

定义全局变量


#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

以上都为个人的理解,有不全的地方请各位能指点迷津。

来源:https://blog.csdn.net/ou832339/article/details/38846383

标签:C#,查找,替换
0
投稿

猜你喜欢

  • Android实现缓存大图到SD卡

    2022-07-13 07:13:50
  • C#实现加密exe文件

    2023-12-03 13:04:47
  • 浅谈Spring中单例Bean是线程安全的吗

    2023-07-12 23:42:21
  • Java 实战项目锤炼之IT设备固定资产管理系统的实现流程

    2023-02-06 01:31:39
  • 解决mybatis三表连接查询数据重复的问题

    2023-09-13 15:24:25
  • Java数据结构超详细分析二叉搜索树

    2022-12-01 01:34:20
  • Java负载均衡算法实现之轮询和加权轮询

    2023-07-16 15:27:17
  • 基于springboot的RestTemplate、okhttp和HttpClient对比分析

    2021-07-02 03:14:21
  • Java深入探究关键字abstract的使用

    2023-08-03 07:48:20
  • Android播放assets文件里视频文件相关问题分析

    2021-08-10 20:04:41
  • Android实现带描边的圆角图片

    2021-09-06 19:00:04
  • 详解如何让Spring MVC显示自定义的404 Not Found页面

    2023-12-12 15:48:47
  • 详解如何在Flutter中获取设备标识符

    2022-12-18 12:41:26
  • Android 中 ActivityLifecycleCallbacks的实例详解

    2022-08-12 06:03:34
  • JDK 7 新特性小结实例代码解析

    2022-04-18 13:03:07
  • java配置多个过滤器优先级以及几个常用过滤器操作

    2023-12-17 01:52:10
  • Flutter Drawer抽屉菜单示例详解

    2022-07-30 12:34:11
  • java编程实现根据EXCEL列名求其索引的方法

    2022-04-24 03:08:03
  • SpringBoot后端进行数据校验JSR303的使用详解

    2022-02-19 01:15:31
  • 详解Java Proxy动态 代理机制

    2023-07-24 21:01:58
  • asp之家 软件编程 m.aspxhome.com