c#从两个字符串之间获取特定的字符串到list

本文关键字:字符串 list string 之间 两个 获取 | 更新日期: 2023-09-27 18:09:50

我有一些关于"从两个字符串之间找到特定字符串并进入列表"的问题。

我有一个这样的字符串:

-begin- 
code:[264]
Name:[1] 
Name:[2] 
Name:[3]
-end- 
code:[264]
Name:[1] 
Name:[4] 
code:[264]
Name:[6]
-begin- 
Name:[6] 
code:[264]
Name:[7] 
Name:[8] 
Name:[1]
-end-

我想把字符串"Name:"在"-begin-"到"-end-"之间分割成如下所示的List,

list<1>
Name:[1] 
Name:[2] 
Name:[3]
list<2>
Name:[6] 
Name:[7] 
Name:[8]
Name:[1]

现在我只能将"-begin-"到"-end-"之间的文本分割成列表。

int first = 0;
int last = 0;
int number = 0;
int start = 0;
  do {
      first = text.IndexOf("-begin-", start);
      last = text.IndexOf("-begin-", first + 1);
         if (first >= 0 && last >= 0)
           {
                number = (last - first);
                AVPline.Add(text.Substring(first,number).Trim());
                start = last + 1;
           }
     } while (position > 0);

我不知道在"-begin-"answers"-end-"之间分割文本后分割字符串"Name:"。

有人能帮我一下吗?

c#从两个字符串之间获取特定的字符串到list<string>

字符串。Split将把字符串解析为数组子字符串。然后处理子字符串。

string[] parseStr = text.Split(''n');

您可以使用枚举器和yield return s实现更清晰和可维护的代码:

首先,让我们把签名弄对。您需要从输入字符串创建一个列表集合:public static IEnumerable<IList<string>> ProcessText(string input)看起来是正确的。

现在,让我们的生活更容易。首先,让我们将输入字符串分成几行:

var lines = input.Split(new[] { Environment.NewLine });

现在,让我们遍历这些行,但让我们不使用foreach来做到这一点。让我们变得更复杂一点,直接使用枚举数,原因稍后就会清楚:

using (var enumerator = lines.GetEnumerator())
{
    while (enumerator.MoveNext()
    {
    }
}

好了,现在我们只需要找到每个子列表的开头,并相应地构建它。这容易:

while (enumerator.MoveNext()
{
    if (enumerator.Current == "-begin-"
        yield return createSubList(enumerator).ToList();
}

现在你知道为什么我直接使用枚举数了。这样我就可以调用另一个方法,方便地跟踪我们在输入文本中的位置:

static IEnumerable<string> createSubList(IEnumerator<string> enumerator)
{
    while (enumerator.MoveNext()
    {
        if (enumerator.Current == "-end-")
        {
            yield break;
        }
        if (!enumerator.Current.StartsWith(...whatever strings you want to ignore))
        {
            yield return enumerator.Current;
        }      
    }
}

我们做完了!让我们把它们放在一起:

public IEnumerable<IList<string>> ProcessText(string input)
{
    var lines = input.Split(new[] { Environment.NewLine });
    using (var enumerator = lines.GetEnumerator())
    {
        while (enumerator.MoveNext()
        {
            if (enumerator.Current == "-begin-"
                yield return createSubList(enumerator).ToList();
        }
    }
}
private static IEnumerable<string> createSubList(IEnumerator<string> enumerator)
{
    while (enumerator.MoveNext()
    {
        if (enumerator.Current == "-end-")
        {
            yield break;
        }
        if (!enumerator.Current.StartsWith(...whatever strings you want to ignore))
        {
            yield return enumerator.Current;
        }      
    }
}

你的尝试离一个可行的解决方案不远了。
我手上只有手机,所以不能给你测试过的代码。但这是我的建议:

  • 你似乎想要一个字符串列表的数组。创建一个List of List of String,因为你不知道你的数组会变成多大。你可以很容易地从列表中得到一个数组。
  • 你需要一个循环。你已经有了。
  • 在循环中,找到你的开始和结束。你差不多已经做到了。您应该搜索-begin--end-
  • -begin--end-之间获取所需的数据,并在内部(嵌套)循环中处理

嵌套循环:

  • 创建字符串列表
  • 取数据,以与外循环相同的方式搜索开始Name和结束]
  • 将找到的元素添加到列表中。

嵌套循环后,仍在外循环内:

  • 将刚刚填写的字符串列表添加到字符串列表的列表中。

外循环结束。

记得使用有效的外部循环条件。在您的示例中,您从未设置过'position'。

相关文章: