【发布时间】: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\">\n\n<html xml
在richTextBox 中,它是从顶部算起的第8 行。 因此,在某些情况下,它可以工作,但在某些情况下,例如这种情况,它不会。也许这取决于我在开始和结束的每一侧标记了多少个字符?
【问题讨论】:
-
你得到那个长字符串的原因是你只寻找一个'm'作为你的startTag。 String.IndexOf(String) 返回搜索字符串第一次出现的索引。你能不能只选择你想查找的文本并计算它的出现而不是你现在正在做什么?
-
是的,我会做一些测试,我认为它有效,你说得对,没有必要标记单个字母。但另一件事是我误会了第一次提取整个文本后的搜索。我说我想用我提取的东西找到所有地方,但没有。我需要的是找到所有具有相同 startTag 和 endTag 的地方,就像我标记的那样,并从中提取标签之间的文本。文字可以不同。
-
我的意思是首先让我们说我有字符串:hello world,我标记了 hel adn world 所以结果将是 lo 现在我想遍历文本并使用 startTag hel 查找更多位置和 endTag world 并提取标签之间的文本,因此在某些地方它可以是结果 lo 和某些地方 56 或 lolo 或其他任何地方。我的意思是搜索应该是标签,然后在所有地方提取它们之间的文本并将提取的字符串添加到列表中。