使用C#中的前缀模式从长字符串中提取字符串列表

时间:2015-11-06 13:57:13

标签: c# arrays regex string parsing

我有一个非常大的字符串,有很多用户名。我想从字符串中提取名称。这意味着我有一个大字符串,里面有很多名字。最后,我想要一个字符串数组中的每个用户名。

字符串示例:

blablablabla@User;\u0004User\username,blablablablablablablabla@User;\u0004User\anotherusername,@Viewblablablablablablablabla
  1. 搜索:u0004User\
  2. 保存所有字符,直到在字符串数组中找到,
  3. 伪代码:

    string [] array = new string []{};
    int i = 0;
    foreach (var c in bigdata)
    {
        if(c == "u0004User\")
        {
          array[i] = c.AllCharactersUntil(','); 
          i++;
          //AllCharactersUntil is a pseudo function
        }
    }
    

2 个答案:

答案 0 :(得分:2)

您可以使用string.IndexOf查找" u0004User \"的索引。然后再次找到以下逗号。然后使用string.Substring获取名称。跟踪当前索引并使用它来告诉IndexOf从哪里开始搜索。

string bigdata =
    @"blablablabla@User;\u0004User\username,blablablablablablablabla@User;\u0004User\anotherusername,@Viewblablablablablablablabla";

string searchValue = @"u0004User\";
int index = 0;
List<string> names = new List<string>();
while (index < bigdata.Length)
{
    index = bigdata.IndexOf(searchValue, index);
    if (index == -1) break;
    int start = index + searchValue.Length;
    int end = bigdata.IndexOf(',', start);
    if (end == -1) break;
    names.Add(bigdata.Substring(start, end - start));
    index = end + 1;
}

Console.WriteLine(string.Join(", ", names));

这将为您提供以下输出

  

用户名,另一个用户名

注意

我认为&#34; \ u0004&#34;值是那6个字符而不是单个unicode字符。如果它是unicode字符,那么您需要进行以下更改

string searchValue = "\u0004User\\";

答案 1 :(得分:1)

这是一个简单的结果:

string input = "blablablabla@User;\\u0004User\username,blablablablablablablabla@User;\\u0004User\anotherusername,@Viewblablablablablablablabla";
List<string> userNames = new List<string>();
foreach (Match match in Regex.Matches(input, @"(u0004User\\)(.*?),", RegexOptions.IgnoreCase))
   {
     string currentUserName = match.Groups[2].ToString();        
     userNames.Add(currentUserName);    // Add UserName to List 
   }