AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu regulären Ausdrücken

Ein Thema von pajofego · begonnen am 3. Feb 2005 · letzter Beitrag vom 4. Feb 2005
Antwort Antwort
Seite 1 von 3  1 23      
pajofego

Registriert seit: 6. Okt 2004
103 Beiträge
 
#1

Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 12:38
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:
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());
}
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!

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
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#2

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 13:01
Verrätst tu uns auch noch welche Regex-Syntax C# benutzt? PCRE scheint es nicht zu sein, oder?!
  Mit Zitat antworten Zitat
pajofego

Registriert seit: 6. Okt 2004
103 Beiträge
 
#3

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 13:16
Ich hoffe ich habe deine Frage richtig verstanden. Soweit ich das weiss ist es PERL.

Gruss pajofego
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#4

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:13
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:
01.02.2005 4256.65 4281.05 4249.69 4279.97 
31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85
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

Danach sollte der rote Teil (ein Match!) nochmals per RE aufgeteilt werden.

Code:
([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\.]+)
"." ist übrigens ein beliebiges Zeichen (es ist eine allumfassende Zeichenklasse). Wenn du "." einfangen willst, braucht es "\." um es auszumaskieren.

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.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#5

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:15
Zitat von pajofego:
Ich hoffe ich habe deine Frage richtig verstanden. Soweit ich das weiss ist es PERL.
Also doch PCRE
Ist aber aufgebohrt, wie's aussieht, denn named groups kenne ich aus PCRE nicht

So, zum Problem:
Nur Datum und die ersten vier Ziffern danach, ohne Uhrzeit? Eh voilá!
Code:
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"]));
}
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.

Edit: Argh, schon wieder zu spät Aber dafür ist mein Ausdruck einfacher
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...
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#6

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:19
@tommie-lie: mit ".*" wäre ich sehr vorsichtig. Schonmal was von gierigen RE gehört?

Zitat von tommie-lie:
Edit: Argh, schon wieder zu spät Aber dafür ist mein Ausdruck einfacher
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...
Einfacher? Nunja, potentiell. Aber erstens sind mir Named Groups ebenfalls nicht bekannt. Aber vielleicht ist das ja Perl 6? Und außerdem ist dein Ausdruck etwas sehr offenherzig und trennt, im Gegensatz zu meinem, nicht gleich die Matches auf.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#7

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:27
Zitat von Assarbad:
@tommie-lie: mit ".*" wäre ich sehr vorsichtig. Schonmal was von gierigen RE gehört?
Ja, deswegen habe ich den ungreedy modifier drangehängt (gibt's auch in Perl schon länger)

Zitat von Assarbad:
Einfacher? Nunja, potentiell. Aber erstens sind mir Named Groups ebenfalls nicht bekannt. Aber vielleicht ist das ja Perl 6?
Aber in der .NET-Regex-Klasse existieren sie, deswegen mache ich auch von gebrauch. Ohne named groups hätte ich halt die numerischen Indizes 1 und 3 genommen.

Zitat von Assarbad:
Und außerdem ist dein Ausdruck etwas sehr offenherzig und trennt, im Gegensatz zu meinem, nicht gleich die Matches auf.
Es gibt in Perl irgendeine Möglichkeit, zu groupen ohne gleichzeitig einen neuen Group-Index einzuführen, aber ich war zu faul, nachzuschauen, wie das ging, deswegen habe ich einfach leichtsinnig die Klammern um "\d{2}\." gesetzt. Ginge natürlich auch mit dem etwas länglicherem Ausdruck "\d{2}\.\d{2}\.\d{4}". Oder was meinst du mit "auftrennen der Matches"?
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#8

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:34
Zitat von tommie-lie:
Zitat von Assarbad:
Und außerdem ist dein Ausdruck etwas sehr offenherzig und trennt, im Gegensatz zu meinem, nicht gleich die Matches auf.
Es gibt in Perl irgendeine Möglichkeit, zu groupen ohne gleichzeitig einen neuen Group-Index einzuführen, aber ich war zu faul, nachzuschauen, wie das ging, deswegen habe ich einfach leichtsinnig die Klammern um "\d{2}\." gesetzt. Ginge natürlich auch mit dem etwas länglicherem Ausdruck "\d{2}\.\d{2}\.\d{4}". Oder was meinst du mit "auftrennen der Matches"?
Wenn du diese Möglichkeit findest, gib mir bescheid. Mit Auftrennen meine ich, daß bei dir ein Match (nämlich $2) für alle 4 Floats zusammen gibt, bei mir einen für jeden Float extra ($2..$5; was ich in Sachen Typensicherheit für besser halte).

Übrigens (@Poster) wie wäre es denn mit Streamingoperatoren? Oder gibt's die in C# nicht mehr?
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#9

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:36
Zitat von tommie-lie:
Zitat von Assarbad:
@tommie-lie: mit ".*" wäre ich sehr vorsichtig. Schonmal was von gierigen RE gehört?
Ja, deswegen habe ich den ungreedy modifier drangehängt (gibt's auch in Perl schon länger)
Stimmt, ist ungreedy. Wenn man das Problem nicht haben will, kann man statt dem Teil auch das schreiben:
Code:
(?: \d{2}\:\d{2} )?
Dort siehst Du dann auch die Antwort auf die Frage, wie man gruppiert ohne einen Index zu verteilen: "?:".
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#10

Re: Frage zu regulären Ausdrücken

  Alt 3. Feb 2005, 14:40
Zitat von Christian S.:
Zitat von tommie-lie:
Zitat von Assarbad:
@tommie-lie: mit ".*" wäre ich sehr vorsichtig. Schonmal was von gierigen RE gehört?
Ja, deswegen habe ich den ungreedy modifier drangehängt (gibt's auch in Perl schon länger)
Stimmt, ist ungreedy. Wenn man das Problem nicht haben will, kann man statt dem Teil auch das schreiben:
Code:
(?: \d{2}\:\d{2} )?
Dort siehst Du dann auch die Antwort auf die Frage, wie man gruppiert ohne einen Index zu verteilen: "?:".
Gehe ich recht in der Annahme, daß es sich dabei um einen "forward lookup" nach ":" handelt?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz