-6

編集:あなたたちは私のお尻の痛みであり、あまり多くを語っていなかったので、誰かがそれを望んでいたので、私はこの試みを一緒にハックしました. それはまさに私が望んでいたことを行います。はい、正規表現はまさに私がやりたいことをするために必要なものであることがわかりました。

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#で区切る/分割する方法を見つけようとしていますが、どこから始めればよいかさえわかりません。string.split と regex.split の使用について私が見つけたすべての例は、次のテキストが StreamReader から読み取られることを考えると、私を混乱させます。

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

test.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

ファイル全体を文字列に読み込む特別な理由はありますか? ファイルを 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または正規表現を使用して分割を行うことができます。このような単純なことには、単純に and を使用IndexOfSubstringます。

于 2013-07-10T21:34:51.640 に答える
0

説明

この正規表現は次のようになります。

  • subject、from、to、および read のフィールド値を取得する
  • フィールドは任意の順序でソース文字列にリストできます
  • 単一で始まる 2 行目の日付を取得します#

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

ここに画像の説明を入力

エキスパンド

  • ^\#(?!\#)1 つしかない最初の行に一致します。#
  • ([^\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. 到達する
  5. 読まれる


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