C# Brauche Hilfe bei Regex.

lordfritte

Lieutenant
Registriert
Juli 2006
Beiträge
955
Hallo ich habe eine Datei, worin Zeilen folgendes Format haben:
Code:
[24.12.2008 00:46:13][Test]: Bla Bla

Also heißt das: {DateTime} {string}: {string} so möchte ich die Zeilen gerne zerlegen, in ein DateTime objekt und 2 Strings, jetzt habe ich aber 2 Probleme,
1. Für mich ist Regex absolut unlogisch, also ich komme damit überhaupt nicht klar.
2. Manche Einträge haben mehrere Zeilen.

also der 2. String braucht mehrere Zeilen, also kann ich nicht einfach die Zeilen trennen, wie könnten also die Regex Suchmuster aussehen?
 
Zuletzt bearbeitet:
Zum ersten Punkt: RegEx ist nicht unlogisch;) Man muss es nur können um es zu verstehen. Dann ist es auch für dich logisch.

Zum zweiten Punkt: Sind das wirklich zwei Zeilen oder bricht dein Editor die Zeilen um, damit man alles lesen kann?
 
Ja es sind richtige Zeilenumbrüche.

Also ich habe jetzt sowas:
PHP:
string text = "[24.12.2008 00:46:13][Test]: Bla Bla";

      Regex r = new Regex(@"(\d{2}.\d{2}.\d{4}\s+\d{2}:\d{2}:\d{2})");
      Regex r2 = new Regex(@"(\w{4})");

      foreach (Match m in r.Matches(text))
      {
        Console.WriteLine(m.ToString());
      }

      foreach (Match m in r2.Matches(text))
      {
        Console.WriteLine(m.ToString());
      }

Aber 1. wie hier Regex r2 = new Regex(@"(\w{4})"); angeben dass er nicht nur 4 sondern x Zeichen lesen soll.
2. er soll bei r2 nicht mehr den ersten Block also das Datum auswerten.
 
Zum Debuggen hier mal ein kleines Tool

1. Ich komme mehr aus der PHP-RegEx-Ecke. Denke das müsste so in der Art lauten r2 = new Regex(@"(\w*)");

2. Da könntest du \]\: am Anfang des Regex schreiben.
 
Ach ich gebs auf.. bei \w* kommt da ein Mist raus, er ließt die Wörter, die leerzeichen, aber nicht zusammen, also am ende habe ich da 5 Stücke
 
Dann probiere es mit (.*) Der Punkt steht für jedes Zeichen.

RegEx ist halt ein sehr komplexes aber auch wichtiges Thema, was überall in der Informatik immer wieder vorkommt.
 
Regex ist am Anfang verdammt schwer. Ich komme vom Fach, aber habe auch mehrere Anläufe gebraucht, um es komplett zu verstehen. Eine Zeile sollte mit folgendem Regex matchen:
Code:
    string text = "[24.12.2008 00:46:13][Test]: Bla Bla";
    Regex r = new Regex(@"^\[(?<datum>[^\s]*)\s(?<zeit>[^\]]*)\]\[(?<testtext>[^\]]*)\]\:\s(?<text>.*)$");
    Regex r2 = new Regex(@"^\[(?<datetime>[^\]]*)\]\[(?<testtext>[^\]]*)\]\:\s(?<text>.*)$");
    Match m = r.Match(text);
    Console.WriteLine(m.Groupes["datum"].Value);
    Console.WriteLine(m.Groupes["zeit"].Value);
    Console.WriteLine(m.Groupes["testtext"].Value);
    Console.WriteLine(m.Groupes["text"].Value);

Ich habe es jetzt nicht probiert, aber vom Prinzip sollte es klappen. Mit r2 ist datum und zeit zusammengefasst.
 
wow danke, aber ich habe jetzt was neues, ich habe habe so einen Ausdruck: ([+\-*/%]{1}|[=<>!]{1,2}|[&|]{2}) damit möchte ich eine Zeichenkette all diesen Zeichen trennen. Kann man das jetzt so ändern dass er + oder - nur dann trenne wenn das Zeichen davor kein e oder E ist?
Weil er soll sowas: 14.8e-3 das soll er als ganzes lassen
 
Dann musst du das - aus deiner ersten Zeichenklasse rausnehmen und gesondert mit oder betrachten:
([+*/%]{1}|[^eE]\-|[=<>!]{1,2}|[&|]{2})
Das heißt er trennt auch an Stellen wo ein "Nicht-E" und ein Minus kommt. Aber er wird dann das Zeichen vor dem Minus als Teil des Trennzeichens deuten und aus den resultierenden Teilstücken entfernen.
 
Danke ich werde da dann mal ein bisschen dran basteln

Also ich habe mich jetzt doch entschieden, alles manuell zu machen, weil ich glaube das was ich vor haben ist zu aufwendig für Regex.
Aber danke für deinen ersten in deinem 1. Regex tipp, Post #9, das geht gut.
 
Zuletzt bearbeitet:
Hallo, also ich habe mal wieder Probleme mit Regex..
Also ich habe folgenden Ausdruck: {foreach Key=k Value=v From=collection}..Irgendwas..{/foreach}
und daraus möchte ich das haben:
Key=k
Value=v
From=collection
..Irgendwas..
 
Ungetestet.
PHP:
Regex r = new Regex(@"^.*Key\=(?<key>\S*)\sValue\=(?<value>\S*)\sFrom\=(?<from>[^\}]*)\}(?<irgendwas>[^\{]*).*$");
Match m = r.Match(text);
Console.WriteLine(m.Groupes["key"].Value);
Console.WriteLine(m.Groupes["value"].Value);
Console.WriteLine(m.Groupes["from"].Value);
Console.WriteLine(m.Groupes["irgendwas"].Value);
 
Zurück
Oben