如何拆分字符串数组?

时间:2014-01-08 23:46:40

标签: c#

我有一个包含以下内容的文件:

Message1 : Some Random String 1
Message2 : Some Random String 2
Message3 : Some Random String 3
Message4 : Some Random String 4
Message5 : Some Random String 5

我想知道如何在':'字符之后拆分每一行。

到目前为止我已经尝试过了,但我没有得到所需的输出:

string splitConfig() {
    string split = ":";  
    string[] lines = File.ReadAllLines("config_file.cfg");
    string linesJoined = lines[0] + "\n" + lines[1] + "\n" + lines[2] + "\n" + lines[3] + "\n" + lines[4];  
    string output = linesJoined.Substring(linesJoined.IndexOf(split) + split.Length);
    return output;
}

这只是返回

"Some Random String 1
Message2 : Some Random String 2
Message3 : Some Random String 3
Message4 : Some Random String 4
Message5 : Some Random String 5"

但我正在寻找输出:

{
    "Some Random String 1", 
    "Some Random String 2", 
    "Some Random String 3", 
    "Some Random String 4", 
    "Some Random String 5"
}

4 个答案:

答案 0 :(得分:3)

这是另一个解决方案,只是为了好玩:

var result = 
    input.Split(new[] { " : ", "\n" }, StringSplitOptions.None)
         .Where((x, i) => i % 2 == 1);

鉴于您的更新,您似乎已经将该文件读入表示每行的字符串数组中,因此您现在需要做的就是在每行:之后获取该部分。你的算法并不遥远,但尝试使用一点Linq,就像这样:

string Char = ":";  
string[] Messages = File.ReadAllLines(@"MessageMenu.cfg");

var Output = Messages.Select(s => s.Substring(s.IndexOf(Char) + Char.Length));

请注意,这不会返回单个字符串,而是IEnumerable<string>,表示文件中的所有消息字符串。

答案 1 :(得分:1)

也许:

var result = input.Split('\n')
                  .Select(x => x.Substring(x.IndexOf(":") + 2));

答案 2 :(得分:1)

你的要求有点难以理解,但我相信这会给你你想要的东西:

var messages = input.Split(new []{Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
                    .Select(l => l.Split(' : ')[1])
                    .ToList();

答案 3 :(得分:0)

或者...

string sourceText = @"
  Message1 : Some Random String 1
  Message2 : Some Random String 2
  Message3 : Some Random String 3
  Message4 : Some Random String 4
  Message5 : Some Random String 5
  " ;
Regex rx = new Regex( @"^\s*(.*?)\s+:\s+(.*?)\s+$" , RegexOptions.Multiline ) ; // using non-greedy accumulation here (.*?) to reduce backtracking
Dictionary<string,string> messages = rx
                                     .Matches(sourceText)
                                     .Cast<Match>()
                                     .ToDictionary(
                                        m => m.Groups[1].Value ,
                                        m => m.Groups[2].Value
                                     ) ;