Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复杂字符串拆分C_C#_.net_String_Parsing_Split - Fatal编程技术网

C# 复杂字符串拆分C

C# 复杂字符串拆分C,c#,.net,string,parsing,split,C#,.net,String,Parsing,Split,我有如下输入文件: string[] elements = string.Split(new char[0]); 输入文件 我使用了这种方法: string[] words = item.Split(' '); 但是,它用空格分隔每个单词。我在引号字符串中也有空格,但我不会拆分这些空格 基本上,我想将此输入从文件解析为此输出: From = aa@aa.com To = bb@bb.com Subject = Information Body = Hi there 如何在C中拆分这些字符串

我有如下输入文件:

string[] elements = string.Split(new char[0]);
输入文件 我使用了这种方法:

string[] words = item.Split(' ');
但是,它用空格分隔每个单词。我在引号字符串中也有空格,但我不会拆分这些空格

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

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

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

正如Spencer所指出的,使用file.ReadAllLines方法读取此文件,然后使用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];
   }
String.Split方法有一个。你可以像这样得到你想要的:

一次读一行 Call input.Splitnew string[],3,StringSplitOptions.None-返回一个包含3部分的字符串数组。因为电子邮件地址中没有空格,所以前两个字符串是from/to地址,第三个字符串是主题和消息。假设此调用的结果存储在firstSplit[]中,则firstSplit[0]是发件人地址,firstSplit[1]是收件人地址,firstSplit[2]是主题和消息的组合。 Call firstSplit[2]。Splitnew string[],2,StringSplitOptions。None-这将搜索上一次调用中连接的主题+消息中的字符串,这将精确定位主题结尾和消息开头之间的分隔符。这将在另一个数组中为您提供主题和消息。里面的双引号是双引号 这假设您不允许在主题和消息中使用双引号。如果允许双引号,那么首先需要确保在将其放入文件之前转义双引号

正如本文所说,您可以简单地使用正则表达式


您也可以尝试使用Replace函数来删除这些字符。

您可以不使用正则表达式,只使用IndexOf和SubString来完成此操作。如果您有多封电子邮件要解析,只需将其放入循环中即可

这并不漂亮,但如果你做了很多,它会比正则表达式快

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
需要参考,但比正则表达式更可靠:

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"
    }
}

查找如何逐行读取文件,然后向上查找以空格将字符串拆分为数组。我只是通过编辑指定了更多内容。从文件中读取的操作已完成。分割成一个数组就完成了。然而,它给了我其他每一个单词,用空格@spencerwieczorekt分隔,这是行不通的,因为邮件的主题和消息中会有空格。从文件中读取并用空格分隔是可以的,但它会用空格分隔。我需要在前两个字符串中使用空格进行拆分,但之后只使用引号,而不使用空格@TalHairFanEat-我喜欢这种方法!这是一种比String.SplitIt更好的方法,它不会处理转义,但我们没有足够的信息知道应该如何处理转义。是的。但在最简单的方法中,在将stringValue传递给Regex.Matchs之前,可以通过简单的替换来处理这些senarios。@bkm是的,但有一个问题是,如果电子邮件内容本身中有引号,你必须用正则表达式解决这个问题,而不是在我的解决方案中使用split,你应该对主题后的第一个引用和最后一个引用进行索引,以获得两者之间的所有内容。第二封电子邮件中只有一个问题。解析与第一封电子邮件大小相同的第二封电子邮件。如果firstEmail=>aa@aa.com第二封电子邮件=>bb@bbbb.com将其拆分为第二封电子邮件=bb@bbb.c@porspector
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"
    }
}