复杂字符串拆分C#

时间:2017-04-30 03:35:02

标签: c# .net string parsing split

我有这样的输入文件:

input.txt中

aa@aa.com bb@bb.com "Information" "Hi there"
cc@cc.com dd@dd.com "Follow up" "Interview"

我使用过这种方法:

string[] words = item.Split(' ');

但是,它会将每个单词与空格分开。我也在引号字符串中有空格,但我不会拆分这些空格。

基本上我想将此输入从文件解析为此输出:

From = aa@aa.com
To = bb@bb.com
Subject = Information
Body = Hi there

如何在C#中拆分这些字符串?

5 个答案:

答案 0 :(得分:5)

只需按照question

中的说法使用Regex即可
var stringValue = "aa@aa.com bb@bb.com \"Information\" \"Hi there\"";

var parts = Regex.Matches(stringValue, @"[\""].+?[\""]|[^ ]+")
            .Cast<Match>()
            .Select(m => m.Value)
            .ToList();

//parts: aa@aa.com
          bb@bb.com
          "Information"
          "Hi there"

您也可以尝试Replace功能删除这些"字符。

答案 1 :(得分:3)

String.Split()方法有overload that allows you to specify the number of splits required。你可以得到你想要的东西:

  1. 一次阅读一行
  2. 调用input.Split(new string[" "], 3, StringSplitOptions.None) - 这会返回一个包含3个部分的字符串数组。由于电子邮件地址中没有空格,前两个字符串将是from / to地址,第三个字符串将是主题和消息。假设此调用的结果存储在firstSplit[]中,然后firstSplit[0]是来自地址,firstSplit[1]是地址,firstSplit[2]是主题和消息的组合。
  3. 调用firstSplit[2].Split(new string[""" """], 2, StringSplitOptions.None) - 这将搜索前一次调用的连接主题+消息中的字符串" ",该消息应指明主题结尾与消息开头之间的分隔符。这将为您提供另一个数组中的主题和消息。 (里面的双引号加倍to escape them
  4. 这假定您不允许在主题和消息中使用双引号。如果你允许双引号,那么你需要确保在将它们放在文件中之前将它们转义。

答案 2 :(得分:1)

如果您要解析多封电子邮件,只需使用IndexOfSubString即可将其置于循环中,而无需使用正则表达式。

它并不漂亮,但如果你做了很多这样的话,它会比RegEx更快。

string content = @"abba@aa.com dddb@bdd.com ""Information"" ""Hi there""";

string firstEmail = content.Substring(0, content.IndexOf(" ", StringComparison.Ordinal));
string secondEmail = content.Substring(firstEmail.Length, content.IndexOf(" ", firstEmail.Length + 1) - firstEmail.Length);

int firstQuote = content.IndexOf("\"", StringComparison.Ordinal);
string subjectandMessage = content.Substring(firstQuote, content.Length - content.IndexOf("\"", firstQuote, StringComparison.Ordinal));

String[] words = subjectandMessage.Split(new string[] { "\" \"" }, StringSplitOptions.None);

Console.WriteLine(firstEmail);
Console.WriteLine(secondEmail);
Console.WriteLine(words[0].Remove(0,1));
Console.WriteLine(words[1].Remove(words[1].Length -1));

输出:

aa@aa.com 
bb@bb.com
Information
Hi there

答案 3 :(得分:0)

正如Spencer指出的那样,使用File.ReadAllLines()方法阅读此文件line by line,然后使用以下内容将String.Split[]方法应用于空格:

string[] elements = string.Split(new char[0]);

<强>更新

不是一个漂亮的解决方案,但这是我认为它可以工作的方式:

   string[] readText = File.ReadAllLines(' ');
   //Take value of first 3 fields by simple readText[index]; (index: 0-2)

   string temp = "";

   for(int i=3; i<readText.Length; i++)
   {    
    temp += readText[i];
   }

答案 4 :(得分:0)

需要引用Microsoft.VisualBasic,但比Regex更可靠:

using (var tfp = new Microsoft.VisualBasic.FileIO.TextFieldParser("input.txt")) {
    for (tfp.SetDelimiters(" "); !tfp.EndOfData;) {
        string[] fields = tfp.ReadFields(); 
        Debug.Print(string.Join(",", fields)); // "aa@aa.com,bb@bb.com,Information,Hi there"
    }
}