2015-06-06 63 views
0

所有文字,我想提取文本从来自richTextBox1.Text 首先我有一个richTextBox1 MouseUp事件在哪里添加到TextBox2中和textBox3串到每个TextBox和随后与提取方法我想提取文本两串之间。用子字符串计算解析字符串的方法有什么问题?

bool isFirstClick = false; 
List<string> result = new List<string>(); 

    private void richTextBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (isFirstClick == false) 
     { 
      textBox2.Text = richTextBox1.SelectedText; 
      isFirstClick = true; 
     } 
     else 
     { 
      textBox3.Text = richTextBox1.SelectedText; 
      isFirstClick = false; 
      result = ExtractFromString(this.richTextBox1.Text, textBox2.Text, textBox3.Text); 
     } 
    } 

而且提取方法:

private List<string> ExtractFromString(string s, string startTag, string endTag) 
     { 
      var names = new List<string>(); 

      int startIndex = 0; 
      int endIndex = 0; 
      int position = 0; 

      startIndex = richTextBox1.Text.IndexOf(startTag); 

      while (startIndex > 0) 
      { 
       endIndex = richTextBox1.Text.IndexOf(endTag, position); 

       //parsing part 
       names.Add(richTextBox1.Text.Substring(startIndex + startTag.Length, 
          endIndex)); 

       position = endIndex + endTag.Length; 

       startIndex = (richTextBox1.Text.IndexOf(startTag, position)); 

       //ending loop 
       if (startIndex == -1) 
       { 
        break; 
       } 
      } 

      return names; 
     } 

的问题是,循环永远不会结束。而名单越来越大。

names.Add(richTextBox1.Text.Substring(startIndex + startTag.Length, 
          endIndex)); 

ArgumentOutOfRangeException:索引和长度必须引用位置的字符串

中在这种情况下,STARTTAG是128

约2-3分钟,我上线越来越异常后和endTag单“ 在这种情况下,整个字符串是:128.png” 它应该给结果是.png

我使用while循环的原因是我想找到第一个t ime在这个地方.png,然后在下一个循环,而所有其他地方在richTextBox1.Text该.png存在。

更新

我的代码现在,这是提取方法:

private void ExtractFromString(string s, string startTag, string endTag) 
{ 
    int startPos = richTextBox1.Text.IndexOf(textBox2.Text) + textBox2.Text.Length; 
    int endPos = richTextBox1.Text.IndexOf(textBox3.Text, startPos); 
    string extractedText = richTextBox1.Text.Substring(startPos, endPos - startPos).Trim(); 
} 

而且在textBox2.Text在这个例子中有个字母:M 在textBox3.Text有字母:red 我想提取的richTextBox1.Text中的字符串是:谋杀 所以我应该得到的结果是:urde

但是我得到的是:

l><html itemscope="" itemtype="http://schema.org/SearchResultsPage" lang="en-IL"><head><meta content="/images/google_favicon_128.png" itemprop="image"><meta content="origin" id="mref" name="referrer"><title>murde 

richTextBox1.Text中的文本很长,我无法将它全部粘贴在这里。

编辑

这是例如在richTextBox1文字: richTextBox1 text content 在我打上RichTextBox的是textBox2.Text第一个标签是字母:X,然后在textBox3.Text结束标记是字母:NS 这个词是:XMLNS 而结果应该毫升 但我得到的是:html11/DTD/xhtml11.dtd\">\n\n<html xml

在它从上线8号RichTextBox的。 所以在某些情况下,它可以工作,但在某些情况下,它不会。也许这取决于我在每一面开始和结束时标记了多少个字符?

+0

你得到那个长字符串的原因是因为你只是在寻找一个'm'作为你的startTag。 String.IndexOf(String)返回搜索字符串的第一个出现的索引。你能不能简单地选择你想查找的文本,并计算出现的那个,而不是你现在正在做的事情? – noMad17

+0

是的,我会做一些测试,我认为它的工作,你没有必要标记单个字母。但另一件事是我错误的是关于在第一次提取后搜索整个文本。我说我想找到我提取的所有地方,但没有。我需要的是找到所有具有相同startTag和endTag的地方,例如我标记并从中提取标签之间的文本。文字可以不同。 –

+0

我的意思是在第一个地方让我说我有字符串:你好世界,我标记hel和世界,所以结果将lo现在我想循环的文本,并找到更多的地方与startTag hel和endTag世界和extrach文本在标签之间,所以在某些地方它可以作为结果和一些地方56或lolo或其他任何地方。我的意思是搜索应该为标签,然后在所有地方提取它们之间的文本,并将提取的字符串添加到List。 –

回答

1

让我们来看看,如果我理解正确。用户在文本中做出两个选择,并且您想要提取位于这两个选择之间的文本?

我给你的问题是:你为什么要返回一个列表,而不是一个包含文本的字符串?

这是我会做什么,我觉得你真的想这样做:

int startPos = richTextBox1.Text.IndexOf(textBox2.Text) + textBox2.Text.Length; 
int endPos = richTextBox2.Text.IndexOf(textBox3.Text, startPos); 
string extractedText = richTextBox1.Text.Substring(startPos, endPos - startPos).Trim(); 

我建议你只这样做一次,以获得您想要的文本中计算的发生了子。然后看看这个链接,以便计算你的子串在文本中出现的次数。 http://rosettacode.org/wiki/Count_occurrences_of_a_substring#C.23

+0

你理解正确。但在你的解决方案,我收到异常:string extractedText = richTextBox1.Text.Substring(startPos,endPos - startPos).Trim();长度不能小于零。当textBox2.Text是128和textBox3.Text是“和他们之间提取的文本是.png –

+0

而richTextBox2也应该是richTextBox1我只有一个richTextBox。最后一件事情,它应该在循环中,我认为这就是为什么我用一个列表,因为我想查找richTextBox1.Text中提取的文本.png的所有位置,它可以只在一个地方,或者可以在文本中的其他30个位置 –

+0

啊,是的,这确实是一种可能性,如果你改变endPos来从startPos开始计数,你将不会遇到这个问题,但是不能保证当搜索到的字符串只是一个单引号时你将得到正确的索引 – noMad17