2016-08-04 6 views
3

Ich habe eine Textdatei und die folgenden ist sein Inhalt:Erhalten mehrzeilige Zeichenfolge von Text-Datei in dem Block von zwei String mit regulärem Ausdruck 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 

und dann muß ich die Anzahl des Blockes bekommen innerhalb von „initTest“ (Es gibt 3 Leerräume vor und nach dem Wort) und "endTest" (vor und nach dem Wort gibt es 3 Leerzeichen) und das Element des Blocks in Array X speichern. Das Ergebnis sollte X [0] = sein {"1234 567 8910 \ n 1234 567 8910"} und X.length = 3.

Ich habe versucht, indem Sie den folgenden Code in C# mit Regex, aber das Ergebnis ist keine Spiel.

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(); 

Ich schätze wirklich jeden Hinweis und Hilfe. Vielen Dank im Voraus.

+0

Was ist der Inhalt von 'text', bevor Sie Ihren Regex-Test dagegen ausführen? – Jasen

+0

@Jasen, eigentlich ist der obige Text nicht der wirkliche Fall, es ist ein vereinfachter Fall des echten. Der Inhalt der realen Textdatei, die ich habe, ist ein mehrzeiliger String. Informiere mich, wenn die Antwort nicht klar ist, bitte. – Cas

Antwort

3

Verwenden

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

wo

initTest(.|\n)*?endTest 

gewünschten Text erfassen, sondern umfasst initTest und Endtest. Die Verwendung von (? < = ...) und (? = ...) wird helfen, sie loszuwerden.

Demo: https://dotnetfiddle.net/tiXRut

+0

ja, es zu lösen, "ich danke Ihnen sehr viel .. – Cas

0

Versuchen Sie, diese Regex:

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

Danke, Ihr Muster ist gleich mit Muster von Smirnov gegeben und ja ,, das ist die Lösung. – Cas

0

Wenn Sie es ohne regulären Ausdruck zu tun, können Sie diese Lösung versuchen können:

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(); 
    } 
}