我想做一个发现和一个发现&替换我的RichTextBox的函数。到目前为止,我已经发现.Find()函数非常方便,但我想不出一个好的方法让它跳到文本框中的下一个单词。
到目前为止,我有这个:
BeginIndex = txtDocument.Find(str, BeginIndex + WordLength, RichTextBoxFinds.None);
WordLength = str.Length;
BeginIndex是一个公共变量,起始为0,与WordLength相同。这样它将开始查看第一个字符,下次它将找不到相同的字符。 但是有一个很大的故障,让我试着描述一下: “你好blablab你好blablaal balbalbla你好blabla”如果我在这句话中寻找“你好”,它将选择第一个你好,然后是第二个,然后是第三个,然后是第三个。之后,它会一遍又一遍地找到第二个和第三个。因为WordLength仍然是> 0
所以我需要一种新方法来告诉Find()方法,它不允许找到已找到的那个,但继续前进,当找到最后一个时,返回第一个。是否有更干净,更好的方法来做到这一点?
编辑:它几乎是固定的,我现在用它:
BeginIndex = txtDocument.Find(str, BeginIndex, RichTextBoxFinds.None);
if(BeginIndex == -1) {
BeginIndex = 0;
SearchString(str, heelwoord, casesensitive);
}
BeginIndex += str.Length;
现在,这循环非常好,而不是自己调用(int if)我也可以创建一个类似“已达到结束!”的MessageBox。但如果它什么也没找到,它会给我一个错误。我使用带有2个复选框的函数,一个执行MatchCase,一个执行WholeWord,但是当我在“asdasdasd”中查找'a'并检查WholeWord时,它会出错,因为它不可用。
答案 0 :(得分:1)
你可能最好不要实现Knuth-Morris Pratt的算法,它可能比内部.NET解决方案更快,它可以让你准确知道字符串的找到位置。之后你可以做子串连接魔术,将结果分配给rtf的文本,你就可以全部设置。
http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm