C#实现记事本查找与替换功能
作者:茗香淡然 发布时间:2022-03-24 00:20:58
标签: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


猜你喜欢
- 前言Java 8 提供了一组称为 stream 的 API,用于处理可遍历的流式数据。stream API 的设计,充分融合了函数式编程的理
- 日期格式化标准 DateTime 格式字符串如果格式字符串只包含下表列出的某个单个格式说明符,则它们被解释为标准格式说明符。如果指定的格式字
- 前言Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化,只是这是默认的行为,无法进一步自定义。注意两点:Pain
- 今天学习了Map集合的几种方法,尤其是遍历Map集合感觉尤为重要,所以发出来供大家学习和自己复习以用。众所周知Map集合里存储元素是以键值对
- 比如在窗体中显示时间:错误思路一:我在窗体结构函数中写入一个死循环,每隔一秒显示一次当前时间public Form6() &n
- 前言古语有云:道为术之灵,术为道之体;以道统术,以术得道。其中:“道”指“规律、道理、理论”,“术”指“方法、技巧、技术”。意思是:“道”是
- 软件版本:IDEA 2020.1Maven 3.6.3 认识静态资源和动态资源静态资源,包含HTMl,图片,CSS,JS等不需要与
- Git有很多可以配置的地方。比如,让Git显示颜色,会让命令输出看起来更醒目:$ git config --global color.ui
- 简介JVM是java程序运行的基础,JVM中各种事件比如:GC,class loading,JPMS,heap,thread等等其实都可以有
- 简介:本文已一个简要的代码示例介绍ThreadLocal类的基本使用方式,在此基础上结合图片阐述它的内部工作原理。早在JDK1.2的版本中就
- 本文实例为大家分享了Unity苹果手机Taptic震动的具体代码,供大家参考,具体内容如下文件:ios震动.zip将上方文件解压之后将Mul
- 随着JDK 14的发布(https://waylau.com/jdk-14-released/),各大Java IDE也开始支持JDK 14
- 本文讲述在mybatis中如何使用ognl表达式实现动态组装sql语句新建Users实体类:public class Users { &nb
- 本文实例讲述了C++实现的求解多元一次方程。分享给大家供大家参考,具体如下:注:这里计算的是n*n的等距矩阵,代码如下:#include&l
- 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理
- 消息队列1.消息队列的原理1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护,1.2 系统中可能有很多的msgqueu
- 图1如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示。如某天产品经理跟我们说,推广人员想要抓取百度新闻中热点要闻版块提高站
- 前言JAVA缓存实现方案有很多,最基本的自己使用Map去构建缓存,或者使用memcached或Redis,但是上述两种缓存框架都要搭建服务器
- 一、什么是CharacterEncodingFilter官方解释如下是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web
- JDK提供的流继承了四大类:InputStream(字节输入流)、OutputStream(字节输出流)、Reader(字符输入流)、Wri