![]() |
Frage zu regulären Ausdrücken
Hallo Leute,
ich bin noch etwas neu in sachen reguläre Ausdrücke und habe folgendes Problem: Meine .txt-Datei besitzt folgendes Format: 01.02.2005 4256.65 4281.05 4249.69 4279.97 31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85 Dabei kann es vorkommen, dass das Datum eine Uhrzeit hat (siehe 2.Zeile) oder auch nicht (siehe 1.Zeile)! Ich hab mich mit folgendem C# Code versucht die Sache zu lesen:
Code:
So wie es oben steht, schaffe ich nur das Datum problemlos einzulesen, hänge ich aber den auskommentierten Teil dran, so passiert dann gar nichts mehr!
string line = stream.ReadLine();
Regex regexDate = new Regex(@"(?<date>\d\d.\d\d.\d\d\d\d)\s"); // + @"(?<number>\d+)\s"); MatchCollection match = regexDate.Matches(line); foreach (Match m in match) { System.Console.WriteLine(" " + m.ToString()); } Kann mir jemand sagen, wie ich den regulären Ausdruck formulieren muss, damit ich das Datum und die anderen vier Zahlen ohne Uhrzeit einlesen kann? Vielen Dank für eure Hilfe, gruss pajofego |
Re: Frage zu regulären Ausdrücken
Verrätst tu uns auch noch welche Regex-Syntax C# benutzt? PCRE scheint es nicht zu sein, oder?!
|
Re: Frage zu regulären Ausdrücken
Ich hoffe ich habe deine Frage richtig verstanden. Soweit ich das weiss ist es PERL.
Gruss pajofego |
Re: Frage zu regulären Ausdrücken
PCRE = Perl Compatible Regular Expression(s)
Aber irgendwie sieht die Syntax oben überhauptnicht nach Perl aus. Aber könnte mich auch irren - ist ja so vielfältig \d == [0-9] (ich benutze letzteres, da es übersichtlicher ist). Bei mir wäre das wohl (sehr weit gefaßt - und jetzt nicht getestet):
Code:
Eine Aufteilung in 2 REs wäre angesagt! Man sollte eine RE nehmen um es wie folgt (rot/grün markiert) zu unterteilen.
01.02.2005 4256.65 4281.05 4249.69 4279.97
31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85 01.02.2005 4256.65 4281.05 4249.69 4279.97 31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85 Danach sollte der rote Teil (ein Match!) nochmals per RE aufgeteilt werden.
Code:
"." ist übrigens ein beliebiges Zeichen (es ist eine allumfassende Zeichenklasse). Wenn du "." einfangen willst, braucht es "\." um es auszumaskieren.
([0-9]{2}\.[0-9]{2}\.[0-9]{2}[\t\s]+[0-9]{2}:[0-9]{2}?|[0-9]{2}\.[0-9]{2}\.[0-9]{2}?)[\s\t]+([0-9\.]+?)[\s\t]+([0-9\.]+?)[\s\t]+([0-9\.]+?)[\s\t]+([0-9\.]+)
Außerdem suchst du nur nach einem Zeichen zwischen 0 und 9 (mit "\d")! Du mußt Modifiere wie "{2}", "{2,2}", "+" oder "*" benutzen. Meine RegEx macht folgendes: Als erstens wird entweder Datum oder Datum+Uhrzeit in den ersten Match gespeichert. Die anderen vier Matches sind dann die Zahlen (aber OHNE die Spaces). Spaces und Tabs können in beliebiger Anzahl zwischen den einzelnen Teilen im String auftauchen (1 und mehr Vorkommen). Es würde also sowohl Space als auch Tab als Trenner erkannt. Es könnte sein, daß in meiner RE das erste Fragezeichen weggelassen werden muß. Da bin ich jetzt nicht so sicher. |
Re: Frage zu regulären Ausdrücken
Zitat:
Ist aber aufgebohrt, wie's aussieht, denn named groups kenne ich aus PCRE nicht :gruebel: So, zum Problem: Nur Datum und die ersten vier Ziffern danach, ohne Uhrzeit? Eh voilá!
Code:
Was wird getan? Es gibt zwei named groups, "date" und "number". Die beiden werden entsprechend definiert, wie sie aussehen sollen, dazwischen kommt ".*?", also beliebige Zeichen, damit der Ausdruck passt, aber so wenige wie möglich. In der Ausgabe wird nicht der gesamte Match genommen, sondern nur die beiden Gruppen, die uns interessieren, nämlich das Datum und die Nummer.
string line = "31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85";
Regex regexDate = new Regex(@"(?<date>(\d{2}\.){2}\d{4}).*?(?<number>\d{4})"); MatchCollection matches = regexDate.Matches(line); foreach (Match m in matches) { listBox1.Items.Add(String.Format("Datum: {0} Wert: {1}", m.Groups["date"], m.Groups["number"])); } Edit: Argh, schon wieder zu spät :wall: Aber dafür ist mein Ausdruck einfacher :mrgreen: Ach ja, ich habe nur die ersten vier Ziffern genommen, falls du die Zahlen als ganzes meintest (4 Ziffern, ein Punkt und nochmal zwei Ziffern), müsstest du meinen Ausdruck noch entsprechend erweitern... |
Re: Frage zu regulären Ausdrücken
@tommie-lie: mit ".*" wäre ich sehr vorsichtig. Schonmal was von gierigen RE gehört?
Zitat:
|
Re: Frage zu regulären Ausdrücken
Zitat:
Zitat:
Zitat:
|
Re: Frage zu regulären Ausdrücken
Zitat:
Übrigens (@Poster) wie wäre es denn mit Streamingoperatoren? Oder gibt's die in C# nicht mehr? |
Re: Frage zu regulären Ausdrücken
Zitat:
Code:
Dort siehst Du dann auch die Antwort auf die Frage, wie man gruppiert ohne einen Index zu verteilen: "?:".
(?: \d{2}\:\d{2} )?
|
Re: Frage zu regulären Ausdrücken
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz