2

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

到目前为止,我有这个:

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

BeginIndex 是一个公共变量,从 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;

现在,这个循环非常好,而不是调用自己(int if),我还可以制作一个 MessageBox,上面写着“End is reached!”。但如果它什么也没找到,它会给我一个错误。我使用带有 2 个复选框的函数,一个执行 MatchCase,一个执行 WholeWord,但是当我在“asdasdasd”中查找“a”并检查 WholeWord 时,它会出错,因为它无法找到。

4

1 回答 1

1

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

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

于 2012-05-02T11:59:02.890 回答