2016-08-04 4 views
3

を使用して2つの文字列のブロック内のテキストファイルの複数行の文字列を取得します。私は、テキストファイルを持っているし、次の内容です正規表現のC#

initTest 
1234 567 8910 
1234 567 8910 
    endTest 

    initTest 
1234 567 8911 
1234 567 8911 
    endTest 

    initTest 
1234 567 8912 
1234 567 8912 
    endTest 

そして私は「initTest」内のブロックの数を取得する必要があります(単語の前後に3つの空白があります)と "endTest"(単語の前後に3つの空白があります)、ブロックの要素を配列Xに保存します。結果は X [0] = {"1234 567 8910 \ n 1234 567 8910"} とX.length = 3

私はRegexを使ってC#でコードを実行してみましたが、結果はnoneです一致する。

string text = line; 
string search = @"(^\s*initTest.*?^\s*endTest)"; 

MatchCollection matches = Regex.Matches(text, search, RegexOptions.Singleline | RegexOptions.IgnoreCase); 

Console.WriteLine("there was {0} matches for '{1}'", matches.Count, search); 

Console.ReadLine(); 

私は本当に手がかりと助けのanykindに感謝します。事前にどうもありがとうございました。

+0

は何ですかRegexテストを実行する前に 'text'の内容を確認しますか? – Jasen

+0

@Jasen、上記のテキストは実際のケースではありませんが、実際のケースの単純化されたケースです。私が持っている実際のテキストファイルの内容は、複数行の文字列です。答えが明確でない場合は、私に知らせてください。 – Cas

答えて

3

initTest(.|\n)*?endTest 

が必要なテキストをキャプチャしますがinitTestとENDTESTを含みます使用

(?<=initTest)(.|\n)*?(?=endTest) 

。 (?< = ...)と(?= ...)を使用すると、それらを取り除くのに役立ちます。

デモ:https://dotnetfiddle.net/tiXRut

+0

はい、それは解決します、非常にありがとう.. – Cas

0

は、この正規表現を試してみてください:

var text = @" 
    initTest 
1234 567 8910 
1234 567 8910 
    endTest 

    initTest 
1234 567 8911 
1234 567 8911 
    endTest 

    initTest 
1234 567 8912 
1234 567 8912 
    endTest 
"; 

var pattern = string.Join(@"\s+", 
    @"\s+initTest", 
    @"(?<sequence1>\d{4} \d{3} \d{4})", 
    @"(?<sequence2>\d{4} \d{3} \d{4})", 
    @"endTest"); 
var matches = Regex.Matches(text, pattern, RegexOptions.Multiline) 
    .Cast<Match>() 
    .Select(x => new 
    { 
     Content = x.Value, 
     Sequence1 = x.Groups["sequence1"].Value, 
     Sequence2 = x.Groups["sequence1"].Value, 
    }); 
0
void Main() 
{ 
    string search = @"(?<=initTest)(.|\n)*?(?=endTest)"; 
    string text = GetData(); 

    MatchCollection matches = Regex.Matches(text, search, RegexOptions.Singleline | RegexOptions.IgnoreCase); 

    Console.WriteLine("there were {0} matches for '{1}'", matches.Count, search); 

    for(int i=0; i < matches.Count; i++) 
     Console.WriteLine(matches[i].Groups[0].ToString()); 

    Console.ReadLine(); 
} 

public string GetData() 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.AppendLine(" initTest"); 
    sb.AppendLine("1234 567 8910"); 
    sb.AppendLine("1234 567 8910"); 
    sb.AppendLine(" endTest"); 

    sb.AppendLine(" initTest"); 
    sb.AppendLine("1234 567 8911"); 
    sb.AppendLine("1234 567 8911"); 
    sb.AppendLine(" endTest"); 
    sb.AppendLine(" "); 
    sb.AppendLine(" initTest"); 
    sb.AppendLine("1234 567 8912"); 
    sb.AppendLine("1234 567 8912"); 
    sb.AppendLine(" endTest"); 

    return sb.ToString(); 
} 
+0

ありがとう、あなたのパターンはsmirnovとはい、与えられたパターンと等しいです、それは解決策です。 – Cas

0

あなたが正規表現せずにそれをしたい場合は、このソリューションを試してください:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string path = @"C:\Projects\StackOverRegX\StackOverRegX\input.txt"; 
     string[] x = new string[100]; 
     int index = 0; 
     if (File.Exists(path)) 
     { 
      using (StreamReader sr = File.OpenText(path)) 
      { 
       string s = ""; 
       while ((s = sr.ReadLine()) != null) 
       { 
        if(s.Contains("initTest")) 
        { 
         x[index] = sr.ReadLine() + " \n " + sr.ReadLine(); 
         index++; 
        } 
       } 
      } 
     } 
     for (int i = 0; i < 100; i++) 
     { 
      if(x[i]!=null) 
      Console.WriteLine(x[i]); 
     } 
     Console.ReadKey(); 
    } 
} 
関連する問題