我有这样的输入文件:
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#中拆分这些字符串?
答案 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。你可以得到你想要的东西:
input.Split(new string[" "], 3, StringSplitOptions.None)
- 这会返回一个包含3个部分的字符串数组。由于电子邮件地址中没有空格,前两个字符串将是from / to地址,第三个字符串将是主题和消息。假设此调用的结果存储在firstSplit[]
中,然后firstSplit[0]
是来自地址,firstSplit[1]
是地址,firstSplit[2]
是主题和消息的组合。 firstSplit[2].Split(new string[""" """], 2, StringSplitOptions.None)
- 这将搜索前一次调用的连接主题+消息中的字符串" "
,该消息应指明主题结尾与消息开头之间的分隔符。这将为您提供另一个数组中的主题和消息。 (里面的双引号加倍to escape them)这假定您不允许在主题和消息中使用双引号。如果你允许双引号,那么你需要确保在将它们放在文件中之前将它们转义。
答案 2 :(得分:1)
如果您要解析多封电子邮件,只需使用IndexOf
和SubString
即可将其置于循环中,而无需使用正则表达式。
它并不漂亮,但如果你做了很多这样的话,它会比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"
}
}