2012-03-30 7 views
0

habe ich einen Text wie:Regex zu erfassen Text um eine wörtliches

Title A 
some description on a few lines, there may be empty lines here 
some description on a few lines 
Status: some random text 
Title B 
some description on a few lines, there may be empty lines here 
some description on a few lines 
Status: some other random text 
Title C 
some description on a few lines, there may be empty lines here 
some description on a few lines 
Status: some other random text 

ich den Text auf den wörtlichen Status: Basis analysieren will und ein Array von Elementen zu erhalten, die jeweils mit Titeln, Textzeilen und Status. Ich benutze C# 4.0.

+5

[Was haben Sie versucht?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+1

der Text gegeben als 'string' oder' string [] 'oder eine andere Struktur? Können Sie ein Beispiel geben, wie das Ergebnis aussehen würde? –

+0

Um dir die Wahrheit zu sagen, habe ich nichts versucht, weil die Aufgabe bei weitem meine Regex-Fähigkeiten übersteigt ... – Lincoln

Antwort

1

Dies ist, wie ich es tun würde (vorausgesetzt, es aus Textdatei gelesen wird):

Regex regStatus = new Regex(@"^Status:"); 
Regex regTitle = new Regex(@"^Title:"); 
string line; 
string[] decriptionLine; 
string[] statusLine; 
string[] titleLine; 
using(TextReader reader = File.OpenText("file.txt")) 
{ 
    while(reader.Peek() > 0) 
    { 
     line = reader.ReadLine(); 
     if(regStatus.IsMatch(line)) 
     { 
      // status line, convert to array, can drop first element as it is "status" 
      statusLine = line.Split(' '); 
      // do stuff with array 
     } 
     else if(regTitle.IsMatch(line)) 
     { 
      // title line, convert to array can drop first element as it is "title" 
      titleLine = line.Split(' '); 
      // do stuff with array 
     } 
     else 
     { 
      // description line, so just split into array 
      decriptionLine = line.Split(' '); 
      // do stuff with array 
     } 
    } 
} 

Sie könnten dann die Arrays nehmen und es in irgendeiner Klasse speichern, wenn man will. Ich werde es dir überlassen, um es herauszufinden. Es verwendet nur eine einfache Regex, um zu überprüfen, ob die Zeile mit "Status:" oder "Title:" beginnt. Um ehrlich zu sein, das ist nicht einmal nötig. Sie könnten etwas tun wie:

if(line.StartsWith("Status:")) {} 
if(line.StartsWith("Title:")) {} 

Um zu überprüfen, ob jede Zeile mit Status oder Titel beginnt.

1

Wenn der Inhalt strukturiert ist, wie Sie beschreiben, können Sie den Text Puffer

string myRegEx = "^String:.*$"; 

// loop through each line in text 

    if (System.Text.RegularExpressions.Regex.IsMatch(line, myRegEx)) 
    { 
     // save the buffer into array 
     // clear the buffer 
    } 
    else 
    { 
     // save the text into the buffer 
    } 
1

einen Elementtyp Deklarieren

public class Item 
{ 
    public string Title { get; set; } 
    public string Status { get; set; } 
    public string Description { get; set; } 
} 

Dann wird der Text in Zeilen aufgeteilt

string[] lines = text.Split(new[] { "\r\n" }, StringSplitOptions.None); 

Or Lesen Sie die Zeilen aus einer Datei mit

string[] lines = File.ReadAllLines(path); 

eine Liste von Elementen erstellen, in dem das Ergebnis wird

var result = new List<Item>(); 

nun gespeichert werden, können wir das Parsing

Item item; 
for (int i = 0; i < lines.Length; i++) { 
    string line = lines[i]; 
    if (line.StartsWith("Title ")) { 
     item = new Item(); 
     result.Add(item); 
     item.Title = line.Substring(6); 
    } else if (line.StartsWith("Status: ")) { 
     item.Status = line.Substring(8); 
    } else { // Description 
     if (item.Description != null) { 
      item.Description += "\r\n"; 
     } 
     item.Description += line; 
    } 
} 

Hinweis tun, dass diese Lösung keine Fehlerbehandlung hat. Dieser Code setzt voraus, dass der Eingabetext immer gut formatiert ist.

+0

Ich vereinfachte den Code etwas, indem ich 'lines [i]' zu 'line' zuordnete und einen Fehler im Beschreibungsteil korrigierte. –

0
string data = @"Title A 


Status: Nothing But Net! 
Title B 
some description on a few lines, there may be empty lines here 
some description on a few lines 
Status: some other random text 
Title C 
Can't stop the invisible Man 
Credo Quia Absurdium Est 
Status: C Status"; 

string pattern = @" 
^(?:Title\s+) 
(?<Title>[^\s]+) 
(?:[\r\n\s]+) 
(?<Description>.*?) 
    (?:^Status:\s*) 
    (?<Status>[^\r\n]+) 
"; 

// Ignorepattern whitespace just allows us to comment the pattern over multiple lines. 
Regex.Matches(data, pattern, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace) 
    .OfType<Match>() 
    .Select (mt => new 
     { 
      Title = mt.Groups["Title"].Value, 
      Description = mt.Groups["Description"].Value.Trim(), 
      Status = mt.Groups["Status"].Value.Trim() 
     }) 
     .ToList() // This is here just to do the display of the output 
     .ForEach(item => Console.WriteLine ("Title {0}: ({1}) and this description:{3}{2}{3}", item.Title, item.Status, item.Description, Environment.NewLine)); 

Ausgang:

Title A: (Nothing But Net!) and this description: 


Title B: (some other random text) and this description: 
some description on a few lines, there may be empty lines here 
some description on a few lines 

Title C: (C Status) and this description: 
Can't stop the invisible Man 
Credo Quia Absurdium Est 
Verwandte Themen