-6

编辑:因为你们让我很头疼,而且没有真正说太多,所以我只是拼凑了这次尝试,因为有人想要它。它完全符合我的要求,是的,事实证明 Regex 正是我需要做的事情。

int counter = 0;
string line;
string temp; 

        System.IO.StreamReader file =
           new System.IO.StreamReader("c:\\final.header");
        while ((line = file.ReadLine()) != null)
        {

            /*if (counter == 5 && Regex.IsMatch(line, @"Read\=.*"))
            {
                counter = counter - 2;
            }*/

            switch (counter)
            {
                case 0:
                    temp = Regex.Replace(line, "##File List", string.Empty);
                    //Console.WriteLine(temp);
                    break;
                case 1:
                    Console.WriteLine(line);
                    break;
                case 2:
                    Console.WriteLine(line);
                    break;
                case 3:
                    Console.WriteLine(line);
                    break;
                case 4:
                    temp = line.Replace("Cc=", "");
                    //Console.WriteLine(temp);
                    break;
                case 5:
                    if (Regex.IsMatch(line, @"Read\=.*"))
                    {
                      Console.WriteLine(line);
                      counter +=1;
                    }
                    else
                    {
                    temp = Regex.Replace(line, @"AttachmentName\=.*", string.Empty);
                    }  
                    break;
                case 6:
                    Console.WriteLine(line);
                    break;
                case 7:
                    temp = Regex.Replace(line, @"parentId\=.*", "");
                    //Console.WriteLine(temp);
                    break;
                case 8:
                    temp = Regex.Replace(line, @"Bcc\=.*", "");
                    //Console.WriteLine(temp);
                    break;
                case 9:
                    temp = Regex.Replace(line, @"Date\=.*", "");
                    //Console.WriteLine(temp);
                    break;
                case 10:
                    temp = Regex.Replace(line, @"format\=.*", "");
                    //Console.WriteLine(temp);
                    break;
                case 11:
                    if (Regex.IsMatch(line, @"To\=.*"))
                    {
                        Console.WriteLine(line);
                        counter += 1;
                    }
                    else
                    {
                        temp = Regex.Replace(line, @"AttachmentId\=.*", "");
                    }
                    //Console.WriteLine(temp);
                    break;
                case 12:
                    Console.WriteLine(line);
                    break;
            }

            if (counter >= 12)
            {
                counter = 0;
            }
            else
            {
                counter++;
            }
        }

我试图弄清楚如何在 C# 中分隔/拆分它,甚至不知道从哪里开始。鉴于以下文本是从 StreamReader 读入的,我发现的所有关于使用 string.split 和 regex.split 的示例都让我感到困惑。

System.IO.StreamReader myFile = new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();

测试.txt:

##File List
#Tue Dec 13 14:27:43 CST 2011
Subject=Research paper.
From=zmeinecke
Cc=
AttachmentName=ADHD Medication Research Paper.docx
Read=true
parentId=
Bcc=
Date=1323748746221
format=blackboard.base.FormattedText$Type\:HTML
AttachmentId=b2cb1016f0b847a3bfae636988aa3f6a
To=ksanger;

基本上,我试图让它成为输出:

Tue Dec 13 14:27:43 CST 2011    
Subject=Research paper.    
From=zmeinecke    
Read=true   
To=ksanger;

谢谢

4

3 回答 3

3

这是一个开始:

string date;
string subject;
string from;
string read;
string to;

foreach (string line in myString.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
{
    if(line.Contains("Subject="))
         subject = line;
    else if (line.Contains("From="))
         from = line;

    //......
}
于 2013-07-10T20:56:00.223 回答
1

您将整个文件读入字符串是否有任何特殊原因?如果您只是逐行阅读文件,事情会容易得多:

foreach (var line in File.ReadLines(@"c:\test.txt"))
{
    string trimmed = line.Trim();
    int pos = trimmed.IndexOf('=');
    if (pos == -1) continue;
    string category = trimmed.Substring(0, pos);
    string content = trimmed.Substring(pos+1);
    switch (category)
    {
        case "Subject":
            // do stuff
            break;
        case "From":
            // do stuff
            break;
        // etc.
    }
}

您可以使用String.Split或正则表达式进行拆分。对于像这样简单的事情,我使用IndexOfandSubstring只是因为我发现它们更容易。

于 2013-07-10T21:34:51.640 回答
0

描述

这个正则表达式将:

  • 捕获主题、从、到和读取的字段值
  • 字段可以以任何顺序在源字符串中列出
  • 在第二行捕获日期以单个开头#

^\#(?!\#)([^\r\n]*)(?=.*?^Subject=([^\r\n]*))(?=.*?^From=([^\r\n]*))(?=.*?^To=([^\r\n]*))(?=.*?^Read=([^\r\n]*))

在此处输入图像描述

展开

  • ^\#(?!\#)匹配只有一个的第一行#
  • ([^\r\n]*)捕获行上不是换行符的所有字符
  • (?=开始对主题的前瞻,这种格式对于正在寻找的每个字段都是相同的。通过使用前瞻,字段可以以任何顺序出现
    • .*?^Subject=穿过字符串直到第一次出现subject在行的开头
    • ([^\r\n]*)捕获所有非换行符
    • )关闭前瞻
  • (?=.*?^From=([^\r\n]*))重复这个过程from
  • (?=.*?^To=([^\r\n]*))重复to
  • (?=.*?^Read=([^\r\n]*))重复read

正则表达式中前瞻发生的顺序决定了捕获值的顺序。您可以根据需要添加更多字段或重新排列它们。

例子

现场示例: http ://www.rubular.com/r/8y1xQZYj05

示例文本

##File List
#Tue Dec 13 14:27:43 CST 2011
Subject=Research paper.
From=zmeinecke
Cc=
AttachmentName=ADHD Medication Research Paper.docx
Read=true
parentId=
Bcc=
Date=1323748746221
format=blackboard.base.FormattedText$Type\:HTML
AttachmentId=b2cb1016f0b847a3bfae636988aa3f6a
To=ksanger;

代码

using System;
using System.Text.RegularExpressions;
namespace myapp
{
  class Class1
    {
      static void Main(string[] args)
        {
          String sourcestring = "source string to match with pattern";
          Regex re = new Regex(@"^\#(?!\#)([^\r\n]*)(?=.*?^Subject=([^\r\n]*))(?=.*?^From=([^\r\n]*))(?=.*?^To=([^\r\n]*))(?=.*?^Read=([^\r\n]*))",RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.Singleline);
          Match m = re.Match(sourcestring);
          for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
            {
              Console.WriteLine("[{0}] = {1}", re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
            }
        }
    }
}

捕获组

  1. 获取日期
  2. 得到主题
  3. 到达
  4. 被阅读


[1] => Tue Dec 13 14:27:43 CST 2011
[2] => Research paper.
[3] => zmeinecke
[4] => ksanger;
[5] => true
于 2013-07-11T04:09:00.123 回答