C# 解析文本时,如何每次推进startPos索引以保持搜索? 例如,在ReXTrimeBox 1中,我有一些文本,在Text Box x2.文本中,我有DAN和Text Box3.Text。我有嘴唇,中间有IEL。

C# 解析文本时,如何每次推进startPos索引以保持搜索? 例如,在ReXTrimeBox 1中,我有一些文本,在Text Box x2.文本中,我有DAN和Text Box3.Text。我有嘴唇,中间有IEL。,c#,.net,winforms,C#,.net,Winforms,现在,我想在richTextBox1中的文本上循环,从索引0到seach,搜索以dan开头、以lip结尾的所有位置,并提取所有位置之间的文本 不确定循环是否正确使用true? 在做了子字符串之后,我还需要以某种方式推进startPos,以便它在下一个索引中继续搜索 稍后,我将更改为使用startTag和endTag,现在我使用textBox2.Text和textBox3.Text作为标记,这已经不重要了。我的想法是如何从索引0中搜索所有位置的标记,并在除第一个位置之外的所有位置提取这些标记之间的

现在,我想在richTextBox1中的文本上循环,从索引0到seach,搜索以dan开头、以lip结尾的所有位置,并提取所有位置之间的文本

不确定循环是否正确使用true? 在做了子字符串之后,我还需要以某种方式推进startPos,以便它在下一个索引中继续搜索

稍后,我将更改为使用startTag和endTag,现在我使用textBox2.Text和textBox3.Text作为标记,这已经不重要了。我的想法是如何从索引0中搜索所有位置的标记,并在除第一个位置之外的所有位置提取这些标记之间的文本

例如,如果textBox2.Text是dan,textBox3.Text是lip,并且我知道这些字符串存在于我选择它们的文本中,那么在任何情况下,这些标记至少存在一次,因为我每次都选择它们


现在搜索文本上的所有其他位置,以查看此标记是否再次存在于其他位置,并提取此位置的文本。

您可以向IndexOf提供第二个参数,就像搜索结束标记时一样。对于下一次迭代,指定上一个endPos作为新搜索的开始位置。将endPos初始化为0,使其在第一次迭代中工作

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

            while (true)
            {
                startPos = richTextBox1.Text.IndexOf(textBox2.Text) + textBox2.Text.Length;
                if (startPos == -1)
                {
                    break;
                }
                int endPos = richTextBox1.Text.IndexOf(textBox3.Text, startPos);
                string extractedText = richTextBox1.Text.Substring(startPos, endPos - startPos).Trim();

            }
            return names;
        }

此代码有3个主要问题:

首先,startPos永远不会是-1,因为它已经被添加为textBox2.Text的长度。 您应该首先测试它是否为-1,只有当它不是时,才添加长度。 其次,需要指定开始查找textBox2.Text索引的第一个位置。通过使用IndexOf方法的不同重载(与endPos相同)来实现这一点,实际上:

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

        while (true)
        {
            startPos = richTextBox1.Text.IndexOf(textBox2.Text, endpos) + textBox2.Text.Length;
            if (startPos == -1)
            {
                break;
            }
            int endPos = richTextBox1.Text.IndexOf(textBox3.Text, startPos);
            string extractedText = richTextBox1.Text.Substring(startPos, endPos - startPos).Trim();

        }
        return names;
    }
第三个问题是,您从未将名称添加到列表中。 一旦发现,应添加:

startPos = richTextBox1.Text.IndexOf(textBox2.Text, endPos);
if (startPos == -1)
{
    break;
}
startPos += textBox2.Text.Length;
string extractedText = richTextBox1.Text.Substring(startPos, endPos - startPos).Trim();
if(!string.isNullOrEmpty(extractedText)
{
    names.Add(extractedText);
}