PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Regex


Funky Bob
2008-06-23, 20:44:47
Hallo,

ich stecke im Moment fest und komme irgendwie nicht weiter.

Ich schreibe im Moment ein kleines Statistiktool für nen Onlinegame um ein wenig Erfahrung mit C#/genereller Programmierung sammeln zu können. Ich möchte nun das Einpfegen der Daten erleichtern, indem der Nutzer einfach den gesamten Seitentext kopiert und in eine textBox in meiner Anwendung einfügt.

Dann soll automatisch geschaut werden, wo welche Forschung welches Level hat und entsprechend gespeichert werden.

Ich habe hier also einen Textausschnitt:
Antriebsforschung
Verbrennungsantrieb (Stufe 17)
Antriebstechnik für kleine Raumschiffe
Benötigt: Eisen: 292.500 Dauer: 16 Tage, 22:15:00 Forschen für Stufe 18
Ionenantrieb (Stufe 5)
Sehr schnelle Antriebstechnik

Und ich suche nun per regex:

string Forschungsdaten = richTextBox1.Text;
Regex testreg = new Regex("Stufe.[0-9]..");
bool testbool = testreg.IsMatch(Forschungsdaten);
MessageBox.Show(Convert.ToString(testbool));

Das funktioniert und liefert mir true zurück.
Aber ich finde leider nirgendwo ein Beispiel, wie ich gefundenen Text ausschneiden und in einen anderen String ausgeben kann, damit ich den weiter bearbeiten kann.

Wenn mir jemand helfen könnte wäre das sehr nett.

The_Invisible
2008-06-23, 21:31:25
zb so


Regex r = new Regex(@"<([^>]+)>([^<]*)</(\1)>");
Match m = r.Match("<M>S</M>");
Console.WriteLine("Tag: {0}, InnerText: {1}", m.Groups[1].Value, m.Groups[2].Value);


mfg

Monger
2008-06-23, 22:59:38
Wie The_Invisible schon gezeigt hat, macht man das über sogenannte Capturing Groups.

Speichernde Gruppen werden mit runden Klammern umfasst. Das kann bei dir z.B. so aussehen:


(\w+)\s\(Stufe\s(\d+\))

Das matcht dir einen Ausdruck, der mit einer Buchstabenfolge anfängt, dann ein Leerzeichen hat, dann eine offene Klammer (die müssen über den Backslash escaped werden), dann das Wort "Stufe", wieder ein Leerzeichen, eine mehrstellige Zahl und zuletzt wieder eine Klammer zu.

Die nullte Gruppe ist grundsätzlich der gesamte Ausdruck. Die erste Gruppe ist in diesem Fall der Text vornedran, und die zweite Gruppe die Zahl hinten in Klammern. Also:

Gruppe 0: Verbrennungsantrieb (Stufe 17)
Gruppe 1: Verbrennungsantrieb
Gruppe 2: 17

Bietchiebatchie
2008-06-24, 01:40:15
Wenn ich mich mit der Syntax von regulären Ausdrücken rumärgern muss, nutze ich meistens Expresso (http://ultrapico.com/Expresso.htm). Man kann insbesonder Beispieltexte direkt testen, was die Sache doch deutlich vereinfacht.

Funky Bob
2008-06-24, 11:03:14
Ok, danke euch, das funktioniert soweit schonmal sehr gut.

Nun habe ich das nächste Problem, ich denke das ist nur ne Kleinigkeit.

Normalerweise sollte mir m.NextMatch ja den nächsten Match einladen, tut es aber nicht?! Das ist das einzige was jetzt noch fehlt..

string Forschungsdaten = richTextBox1.Text;
string zwischenspeicher;
Regex Vorabregex = new Regex(@"\(Stufe\s(\d+)");
Match m = Vorabregex.Match(Forschungsdaten);
while (m.Success)
{
zwischenspeicher = m.Groups[1].Value;
MessageBox.Show(Convert.ToString(zwischenspeicher));
m.NextMatch();
}

Jetzt ist meine Frage nur, warum sucht er nicht weiter?

Monger
2008-06-24, 11:38:02
Mach es dir doch nicht unnötig kompliziert - verwende einfach die "Matches" Methode. Die gibt dir gleich alle Matches zurück die eben im genannten String sind.

Funky Bob
2008-06-24, 11:49:28
Ok ich habs nun!

anstatt

m.NextMatch();

muss es

m = m.NextMatch();

heißen *gg* Danke euch!!