c# - 查找/替换功能 RichTextBox

标签 c#

我想为我的 RichTextBox 创建一个查找和查找与替换功能。到目前为止,我发现 .Find() 函数非常方便,但我想不出一个好方法让它跳到文本框中的下一个单词。

到目前为止我有这个:

BeginIndex = txtDocument.Find(str, BeginIndex + WordLength, RichTextBoxFinds.None);
WordLength = str.Length;

BeginIndex 是一个公共(public)变量,从 0 开始,与 WordLength 相同。这样它就会开始寻找第一个字符,下次就不会找到相同的字符了。 虽然有一个很大的故障,让我试着描述一下: “Hello blablab hello blablaal balbalbla hello blabla” 如果我在这句话中查找“hello”,它将选择第一个 hello,然后是第二个,然后是第三个,然后再次选择第三个。之后它会一遍又一遍地找到第二个和第三个。因为 WordLength 仍然 > 0。

所以我需要一种新的方法来告诉 Find() 方法它不允许找到已经找到的那个,但是继续前进,当找到最后一个时,回到第一个。有没有更干净、更好的方法来做到这一点?

编辑:它几乎是固定的,我现在使用它:

BeginIndex = txtDocument.Find(str, BeginIndex, RichTextBoxFinds.None);

if(BeginIndex == -1) {
    BeginIndex = 0;
    SearchString(str, heelwoord, casesensitive);
}

BeginIndex += str.Length;

现在,这个循环非常好,我还可以创建一个 MessageBox 来表示“已到达终点!”之类的内容,而不是调用自身(int the if)。但如果它什么也没找到,它就会给我一个错误。我使用带有 2 个复选框的函数,一个执行 MatchCase,一个执行 WholeWord,但是当我在“asdasdasd”中查找“a”并检查 WholeWord 时,它会出错,因为它无法找到。

最佳答案

实现 Knuth-Morris Pratt 的算法可能会更好,它可能比内部 .NET 解决方案更快,并且可以让您准确知道字符串的位置。之后您可以进行子字符串连接魔术,将结果分配给 rtf 的文本,一切就绪。

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

关于c# - 查找/替换功能 RichTextBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406594/

相关文章:

c# - 我可以将 Windows Identity Foundation 3.5 与 .NET 4.5 一起使用吗?

c# - .Where 列表上的 linq 查询在静态方法中失败了吗? (不,延迟评价)

c# - 要序列化的同名属性

c# - 从 C# 中的 cmd.Parameters 获取 ReturnValue?

c# - 从 MVC2 中的枚举获取单选按钮

c# - 我们是否需要在 using block 中关闭 C# BinaryWriter 或 BinaryReader?

c# - 有什么方法可以将 ASP.NET Core 2.0 HTTPS 限制为 TLS 1.2?

c# - 打开不同的方法但使用相同的名称 - C#

c# - 圆角网格角匹配窗口圆角

c# - 将秒数转换为天数,hh :mm:ss C#