【问题标题】:What is wrong with the method that parse the string with the substring calculation?用子串计算解析字符串的方法有什么问题?
【发布时间】:2015-06-06 21:51:37
【问题描述】:

我想从中提取文本的所有文本都来自richTextBox1.Text 首先我有一个richTextBox1 MouseUp 事件,我在每个文本框中添加一个textBox2 和textBox3 字符串,然后使用提取方法我想提取两个字符串之间的文本。

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;
        }

问题是循环永远不会结束。而且 List 的名字越来越大。

大约 2-3 分钟后,我在线上遇到异常:

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

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

在这种情况下,startTag 是 128,endTag 是单个" 在这种情况下,整个字符串是:128.png" 它应该给出的结果是.png

我使用while循环的原因是我想第一次在这个地方找到.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 有字母:红色 我想从中提取的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 结果应该是 ml 但我得到的是:html11/DTD/xhtml11.dtd\"&gt;\n\n&lt;html xml

在richTextBox 中,它是从顶部算起的第8 行。 因此,在某些情况下,它可以工作,但在某些情况下,例如这种情况,它不会。也许这取决于我在开始和结束的每一侧标记了多少个字符?

【问题讨论】:

  • 你得到那个长字符串的原因是你只寻找一个'm'作为你的startTag。 String.IndexOf(String) 返回搜索字符串第一次出现的索引。你能不能只选择你想查找的文本并计算它的出现而不是你现在正在做什么?
  • 是的,我会做一些测试,我认为它有效,你说得对,没有必要标记单个字母。但另一件事是我误会了第一次提取整个文本后的搜索。我说我想用我提取的东西找到所有地方,但没有。我需要的是找到所有具有相同 startTag 和 endTag 的地方,就像我标记的那样,并从中提取标签之间的文本。文字可以不同。
  • 我的意思是首先让我们说我有字符串:hello world,我标记了 hel adn world 所以结果将是 lo 现在我想遍历文本并使用 startTag hel 查找更多位置和 endTag world 并提取标签之间的文本,因此在某些地方它可以是结果 lo 和某些地方 56 或 lolo 或其他任何地方。我的意思是搜索应该是标签,然后在所有地方提取它们之间的文本并将提取的字符串添加到列表中。

标签: c# .net winforms


【解决方案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

【讨论】:

  • 你没看错。但是在您的解决方案中,我遇到了异常: string extractText = richTextBox1.Text.Substring(startPos, endPos - startPos).Trim();长度不能小于零。当 textBox2.Text 是 128 并且 textBox3.Text 是 " 并且它们之间要提取的文本是 .png
  • 而且richTextBox2 也应该是richTextBox1 我只有一个richTextBox。最后一件事应该在循环中,我认为这就是我使用 List 的原因,因为我想在richTextBox1.Text 中找到提取的文本 .png 存在的所有位置。它可以只在一个地方,也可以在文本中的其他 30 个地方。
  • 啊,是的,确实有这种可能,如果将 endPos 更改为从 startPos 开始计数,则不会遇到该问题。但是,当搜索的字符串只是一个单引号时,不能保证您将获得正确的索引。
  • 我的意思是我正在提取特定索引中的字符串 .png 例如开始索引 34 结束索引 40 现在我有一个字符串 .png 现在我想搜索 .png richTextBox1.Text 如果它存在于更多地方,也提取这些地方。所以最后在 List 我可以有一个项目或 30 个项目。
  • 好吧,但是为什么你想要一个包含多个字符串都等于“.png”的列表呢?仅计算字符串在文本中出现的次数还不够吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2011-08-22
  • 2016-06-28
  • 2011-10-09
相关资源
最近更新 更多