C# Brauche Hilfe bei Regex.

lordfritte

Lieutenant
Dabei seit
Juli 2006
Beiträge
809
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:

krizzelfix

Commander
Dabei seit
Sep. 2005
Beiträge
2.626
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?
 

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
809
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.
 

krizzelfix

Commander
Dabei seit
Sep. 2005
Beiträge
2.626
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.
 

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
809
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
 

krizzelfix

Commander
Dabei seit
Sep. 2005
Beiträge
2.626
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.
 

pvc-junkie

Ensign
Dabei seit
Juni 2007
Beiträge
154
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.
 

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
809
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
 

pvc-junkie

Ensign
Dabei seit
Juni 2007
Beiträge
154
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.
 

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
809
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:

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
809
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..
 

pvc-junkie

Ensign
Dabei seit
Juni 2007
Beiträge
154
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);
 
Top