我想为我的 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/