2015-06-06 64 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