Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu regulären Ausdrücken (https://www.delphipraxis.net/39475-frage-zu-regulaeren-ausdruecken.html)

pajofego 3. Feb 2005 11:38


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:
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

Assarbad 3. Feb 2005 12:01

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?!

pajofego 3. Feb 2005 12:16

Re: Frage zu regulären Ausdrücken
 
Ich hoffe ich habe deine Frage richtig verstanden. Soweit ich das weiss ist es PERL.

Gruss pajofego

Assarbad 3. Feb 2005 13:13

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:
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.

tommie-lie 3. Feb 2005 13:15

Re: Frage zu regulären Ausdrücken
 
Zitat:

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 :gruebel:

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 :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...

Assarbad 3. Feb 2005 13:19

Re: Frage zu regulären Ausdrücken
 
@tommie-lie: mit ".*" wäre ich sehr vorsichtig. Schonmal was von gierigen RE gehört?

Zitat:

Zitat von tommie-lie
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...

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.

tommie-lie 3. Feb 2005 13:27

Re: Frage zu regulären Ausdrücken
 
Zitat:

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) :zwinker:

Zitat:

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:

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"?

Assarbad 3. Feb 2005 13:34

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von tommie-lie
Zitat:

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?

Christian S. 3. Feb 2005 13:36

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von tommie-lie
Zitat:

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) :zwinker:

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: "?:".

Assarbad 3. Feb 2005 13:40

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von Christian S.
Zitat:

Zitat von tommie-lie
Zitat:

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) :zwinker:

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?

Christian S. 3. Feb 2005 13:46

Re: Frage zu regulären Ausdrücken
 
Ich weiß, ehrlich gesagt, nicht, was ein "forward lookup" ist. In den Anleitungen, wo man "?:" findet, wird es einem einfach als Möglichkeit präsentiert, einen geklammerter Ausdruck nicht mitzuzählen. Und das funktioniert, war ich damit erstmal zufrieden. :stupid:

pajofego 3. Feb 2005 15:30

Re: Frage zu regulären Ausdrücken
 
Hey cool danke! Ich glaube ich habs dank euch zum funktionieren gebracht: :thumb:

Code:
public static void ParseFile(string fileName)
{
 if (!System.IO.File.Exists(fileName))
 {
  Console.WriteLine("The file specified does not exist.");
 }
  else
 {
  FileStream f = new FileStream(fileName, FileMode.Open);
  StreamReader stream = new StreamReader(f);

  while (!stream.EndOfStream)
  {
   string line = stream.ReadLine();

   Regex regexDate = new Regex(@"(?<date>(\d{2}\.){2}\d{4}).*?(?<number1>\d{4}\.\d{2}).*?(?<number2>\d{4}\.\d{2}).*?(?<number3>\d{4}\.\d{2}).*?(?<number4>\d{4}\.\d{2})");
   MatchCollection match = regexDate.Matches(line);
   foreach (Match m in match)
   {
     Console.WriteLine(m.Groups["date"].ToString());
     Console.WriteLine(m.Groups["number1"].ToString());
     Console.WriteLine(m.Groups["number2"].ToString());
     Console.WriteLine(m.Groups["number3"].ToString());
     Console.WriteLine(m.Groups["number4"].ToString());
   }
  }
 }
}
A bissle eng geworden, aber ich hoffe man kann es noch lesen!

@Assarbad

Ich hab dein Code ausprobiert aber der hat das ganze nicht gematch, leider habe ich nicht das notwendige Wissen um herauszufinden warum es nicht ging. :?

Gibt es irgendwo eine Doku im Netz wo ich mir ein paar Beispiele anschauen kann, damit ich diese Syntax besser verstehen kann.

Ansonsten vielen Dank für eure Hilfe,

beste Grüße pajofego

P.S.: Obiger Code basiert auf das .NET 2.0 Framework

Assarbad 3. Feb 2005 15:53

Re: Frage zu regulären Ausdrücken
 
@pajofego: Ich empfehle dir "Reguläre Ausdrücke - Kurz und Gut" (von O'Reilly) sowie das Buch "Reguläre Ausdrücke" von Jeffrey Friedl.

Desweiteren gibt es eine gute Einführung in der Perldokumentation von SelfHTML.

tommie-lie 3. Feb 2005 16:49

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von Assarbad
Wenn du diese Möglichkeit findest, gib mir bescheid.

Hat Christian gepostet, das Fragezeichen hinter der Klammer gehört aber nciht dazu ;-) Also alle Subpatterns, die mit ?: beginnen, sind "non-capturing patterns", können also nicht indiziert werden.

Zitat:

Zitat von Assarbad
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).

Nein, bei mir nimmt er nur die ersten vier Ziffern, weil ich die Frage des OP ein wenig missverstanden habe. Aber so, wie er es jetzt umgesetzt hat, findet er ja die vier Floats einzeln, bei mir hat er quasi nur Trunc(Float1) gefunden ;-)

Zitat:

Zitat von Christian S.
Ich weiß, ehrlich gesagt, nicht, was ein "forward lookup" ist.

Fachbegriff: positive assertion, dann hätte allerdings noch ein = zwischen Fragezeichen und Doppelpunkt gemusst: "(?=:)" (die Klammern sind syntaktisch zwingend für Assertions). Der Doppelpunkt muss dann unbedingt vorhanden sein, zählt aber nicht zum Subpattern.

Zum Thema PCRE lernen:
Immer wieder diese Bücherwürmer, ich sehe da absolut keine Notwendigkeit für, ein Buch zu kaufen... In der PHP-Doku zu PCRE-Funktionen ist eine sehr gute Beschreibung zur PCRE-Syntax und den Pattern Modifiers. Allerdings scheint die für die Regex-Klasse obsolet zu sein, denn besagte named groups sind noch nicht enthalten. Ob die mit Perl6 dazugekommen sind, oder eine Spezialität von .NET (auch in 1.1 gab's die schon) sind, weiß ich nicht, aber ich finde sie sind 'ne tolle Erfindung.
Die Beschreibung aus der Perl-Doku kenne ich nicht, eventuell könnte da aber was über die Neuerungen von Perl6 drinstehen, wenn es welche gab.

Christian S. 3. Feb 2005 17:45

Re: Frage zu regulären Ausdrücken
 
Für den Einstieg kann ich das hier empfehlen. Habe ich auch mit angefangen und fand es sehr gut!

Zitat:

Hat Christian gepostet, das Fragezeichen hinter der Klammer gehört aber nciht dazu :wink:
Nee, dass ist natürlich dafür da, dass da mal 'ne Uhrzeit steht und mal nicht. :-)

positive assertion: *googlet* Ach so, das ist das. Naja, noch nie gebraucht ;-)

tommie-lie 3. Feb 2005 18:09

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von Christian S.
positive assertion: *googlet* Ach so, das ist das. Naja, noch nie gebraucht ;-)

Ich schon, aber es gibt auch nicht wirklich viele Anwendungszwecke für sowas. Da brauch' ich eher rekursive Subpatterns ;-)

Assarbad 3. Feb 2005 18:19

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von tommie-lie
Immer wieder diese Bücherwürmer, ich sehe da absolut keine Notwendigkeit für, ein Buch zu kaufen... In der PHP-Doku zu PCRE-Funktionen ist eine sehr gute Beschreibung zur PCRE-Syntax und den Pattern Modifiers. Allerdings scheint die für die Regex-Klasse obsolet zu sein, denn besagte named groups sind noch nicht enthalten. Ob die mit Perl6 dazugekommen sind, oder eine Spezialität von .NET (auch in 1.1 gab's die schon) sind, weiß ich nicht, aber ich finde sie sind 'ne tolle Erfindung.
Die Beschreibung aus der Perl-Doku kenne ich nicht, eventuell könnte da aber was über die Neuerungen von Perl6 drinstehen, wenn es welche gab.

Ich gestehe, ich bin bibliophil! Aber deswegen mußt du mich noch lange nicht hier diskriminieren, sonst sag ich Gerome bescheid! :cry:

Bücher sind eine ziemlich feine Sache (außer der Tatsache, daß man sich damit inzwischen gemischt 3 Rechtschreibungen antut *kotz*) und in zweitgenanntem Buch werden RegExes eben nicht nur in Perl sondern auch in (E)Grep und Emacs und anderen Tools besprochen. Außerdem gibt es eine Regex um Emailadressen nach RFC zu verifizieren - ist aber zu lang um sie hier abzutippen. Naja und dann noch viele technische Details. Als perlophiler Admin kann ich mir REs nicht mehr wegdenken.

In Sachen "?:": ich hatte mehr gehofft, daß ich mehrfache Vorkommen von einem Pattern auch in mehrere Matches pushen kann, ohne mehrfach Klammern zu setzen. Bsp:

/([0-9\.]+?){4}[\s\t]/

sollte am besten $1 bis $4 mit den Matches der einzelnen "Subpattern" belegen. Das geht aber leider nicht.

Die Perldoku in SelfHTML findet sich hier: http://de.selfhtml.org/cgiperl/sprache/regexpr.htm

tommie-lie 3. Feb 2005 19:05

Re: Frage zu regulären Ausdrücken
 
Du benutzt ziemlich gerne den Suffix "phil", kann das sein? :mrgreen: (Edit: bist du also ein Philophiler? :gruebel:)
Zitat:

Zitat von Assarbad
Ich gestehe, ich bin bibliophil!

Ich auch, aber nicht was Fachbücher angeht ;-)
Zitat:

Zitat von Assarbad
Als perlophiler Admin kann ich mir REs nicht mehr wegdenken.

Auch wenn ich eher der PHP-Typ bin, ich bin heilfroh, daß es sie gibt.

Zitat:

Zitat von Assarbad
In Sachen "?:": ich hatte mehr gehofft, daß ich mehrfache Vorkommen von einem Pattern auch in mehrere Matches pushen kann, ohne mehrfach Klammern zu setzen. Bsp:
/([0-9\.]+?){4}[\s\t]/
sollte am besten $1 bis $4 mit den Matches der einzelnen "Subpattern" belegen. Das geht aber leider nicht.

Stimmt, und mir ist auch keine Möglichkeit bekannt, das irgendwie hinzukriegen, außer alle vier Subpatterns auszuschreiben.

Assarbad 3. Feb 2005 19:44

Re: Frage zu regulären Ausdrücken
 
[OT]
Zitat:

Zitat von tommie-lie
Du benutzt ziemlich gerne den Suffix "phil", kann das sein? :mrgreen: (Edit: bist du also ein Philophiler? :gruebel:)

Ich bin multiphil *g*

Und ob Fachbücher oder nicht ist bei mir auch egal - denn Sprachbücher von 1910, oder Abhandlungen über jüdische Geistliche von 1860 sind im Grunde ja auch Fachbücher. Aber unheimlich interessant.

Auch hat jedes Buch eine eigene Geschichte. Ich besitze zB ein englisches Buch von 1936 "Roots of the Russian language", welches einem deutschen Kriegsgefangenen gehört haben muß, welcher in den USA einsaß. Es ist ein Stempel des Gefangenenlagers im Buch enthalten.
[/OT]

pajofego 3. Feb 2005 23:44

Re: Frage zu regulären Ausdrücken
 
Hallo Leute,

sorry wenn ich euch nochmal belästigen muss, aber ich hab noch eine frage!

Mein Problem ist jetzt, dass meine Zahlenreihe irgendwann folgende gestallt animmt:

19.06.1985 998.00 998.00 998.00 998.00 0

oder auch

02.02.2005 00:58 1.3041 1.3049 1.3037 1.3047 0

Zum Einlesen benutze ich den von euch vorgeschlagenen Code:
Code:
(?<number>\d{4}\.\d{2})
Wie muss ich den ändern, damit er vor dem Punkt Zahlen mit 1-4 Stellen einliest und nach dem Punkt Zahlen mit max. 3 Stellen liest? Gibt es eine Art Bereichsdefinition für so etwas? :gruebel:

Danke nochmal!

Gruss pajofego

Assarbad 3. Feb 2005 23:47

Re: Frage zu regulären Ausdrücken
 
Warum benutzt du nicht [0-9\.] wie ich oben bereits beschrieb. Damit deckst du alle Floats ab ... mit ?[\s\t]+ kannst du dann die trennenden Blankspaces oder Tabulatoren einfangen.

Konkreter:

Code:
(?<number>[0-9\.]+?)[\s\t]+

pajofego 4. Feb 2005 01:04

Re: Frage zu regulären Ausdrücken
 
Sorry, hab ich übersehen! :oops:

Jetzt zumindestens klappt es mit dem einlesen beliebig langer floats, dafür habe ich jetzt an anderer Stelle ein Problem:


31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85 0
28.01.2005 4225.36 4235.34 4188.21 4201.81 0

Falls die Uhrzeit auftaucht (Zeile 1) liest er für die erste Gruppe den Wert 45 von 17:45 raus anstatt 4211.86. Bei der zweiten Zeile klappt es.

Code:
(?<date>(\d{2}\.){2}\d{4})[\t\s]+.*?(?<number>[0-9\.]+?)[\s\t]
Ich hab auch schon die anderen Vorschläge ausprobiert, entweder er matcht es nicht oder wirft eine Exception raus! Ich habe beim ersten Vorschlag eine "Oder" Verknüpfung gelesen aber irgendwie checke ich die nicht! Könnt ihr mir noch mal bei dieser Sache helfen?

Danke,

gruss pajofego

Assarbad 4. Feb 2005 07:32

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von pajofego
31.01.2005 17:45 4211.86 4258.41 4211.86 4254.85 0
28.01.2005 4225.36 4235.34 4188.21 4201.81 0

Falls die Uhrzeit auftaucht (Zeile 1) liest er für die erste Gruppe den Wert 45 von 17:45 raus anstatt 4211.86. Bei der zweiten Zeile klappt es.

Code:
(?<date>(\d{2}\.){2}\d{4})[\t\s]+.*?(?<number>[0-9\.]+?)[\s\t]
Ich hab auch schon die anderen Vorschläge ausprobiert, entweder er matcht es nicht oder wirft eine Exception raus! Ich habe beim ersten Vorschlag eine "Oder" Verknüpfung gelesen aber irgendwie checke ich die nicht! Könnt ihr mir noch mal bei dieser Sache helfen?

Hi pajofego,

das ".*" ist überflüssig im obigen Ausdruck

Statt:
Code:
(?<date>(\d{2}\.){2}\d{4})[\t\s]+.*?(?<number>[0-9\.]+?)[\s\t]
so:
Code:
(?<date>(\d{2}\.){2}\d{4})[\t\s]+?(?<number>[0-9\.]+?)[\s\t]
Wenn wir uns das dann anschauen, gibt es dort noch keine Regex für den Teil mit der Uhrzeit. Ich meine, man sollte Uhrzeit und Datum zusammen matchen, weil du ansonsten ja die anderen Indeces verschiebst - aber vielleicht ist das bei named groups kein Problem.

Jedenfalls funktioniert das ODER so:

Geklammerter Ausdruck um foo und bla zu matchen
Code:
(foo|bla)
Aber bei dir könnte auch folgendes funktionieren (irgendwas mit deiner Klammerung stimmt aber nicht):
Code:
(?<date>(\d{2}\.){2}\d{4}(?:[\t\s]+\d{2}:\d{2}){0,1})[\t\s]+?(?<number>[0-9\.]+?)[\s\t]
Dieser Teilausdruck:
Code:
(?:[\t\s]+\d{2}:\d{2}){0,1}
soll folgendes bewirken. Er fängt zuerst den Trenner (Space, Tab) ein und dann wird geschaut, ob es zwei Ziffern mit : und wieder zwei Ziffern gibt. "{0,1}" besagt, daß dieser Ausdruck 0 oder 1mal vorkommen kann.

tommie-lie 4. Feb 2005 10:11

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von Assarbad
Ich meine, man sollte Uhrzeit und Datum zusammen matchen, weil du ansonsten ja die anderen Indeces verschiebst - aber vielleicht ist das bei named groups kein Problem.

Es ist kein Problem, weil man ja über den Namen drauf zugreifen kann. Ich glaube, du denkst ein wenig zu sehr um die Ecke ;-)

Zitat:

"{0,1}" besagt, daß dieser Ausdruck 0 oder 1mal vorkommen kann.
Abgekürzt mit "?" ;-)

Also ich würd's mit folgendem Ausdruck machen:
Code:
(?<date>(\d{2}\.){2}\d{4})([\s\t]+?\d{2}:\d{2})?[\s\t]+?(?<number1>[0-9\.]+)[\s\t]+?(?<number2>[0-9\.]+)[\s\t]+?(?<number3>[0-9\.]+)[\s\t]+?(?<number4>[0-9\.]+)
Der funktioniert mit der Zeichenkette "31.01.2005 17:45 421186 4.25841 4.6 4.285" mit und ohne Uhrzeit und auch mit jeder der vier Fließkommazahlen, Länge der Zahl und Ort des Trenners ist also egal. Zugegriffen werden kann über die Gruppen "date" und "number1" bis "number4".
Wenn man's "schön" haben will, nimmt man den Ausdruck:
Code:
(?<date>(?:\d{2}\.){2}\d{4})(?:[\s\t]+?\d{2}:\d{2})?[\s\t]+?(?<number1>[0-9\.]+)[\s\t]+?(?<number2>[0-9\.]+)[\s\t]+?(?<number3>[0-9\.]+)[\s\t]+?(?<number4>[0-9\.]+)

Assarbad 4. Feb 2005 10:50

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von tommie-lie
Zitat:

"{0,1}" besagt, daß dieser Ausdruck 0 oder 1mal vorkommen kann.
Abgekürzt mit "?" ;-)

Na ich weiß nicht was deutlicher ausgedrückt ist :gruebel:

Wenn du über Abkürzungen usw. streiten willst, kann ich dir deine Regex sicherlich in mindestens einem dutzend anderer aber gleichwertiger Varianten anbieten. Das ist müßig.

Übrigens, falls du mal schaust: ich habe immer versucht die Bedeutung der jeweiligen Regexes oder Teile davon zu erklären. Ich dachte dies sei der Sinn eines Forums?! Wenn jedoch Fertiglösungen erwünscht sind bin ich in diesem Thread falsch :|

tommie-lie 4. Feb 2005 10:59

Re: Frage zu regulären Ausdrücken
 
Zitat:

Zitat von Assarbad
Wenn du über Abkürzungen usw. streiten willst, kann ich dir deine Regex sicherlich in mindestens einem dutzend anderer aber gleichwertiger Varianten anbieten.

Ich weiß ;-) Aber das Fragezeichen ist mir sympathischer als {0,1}, ich weiß auch nicht, warum.

Zitat:

Zitat von Assarbad
Übrigens, falls du mal schaust: ich habe immer versucht die Bedeutung der jeweiligen Regexes oder Teile davon zu erklären. Ich dachte dies sei der Sinn eines Forums?! Wenn jedoch Fertiglösungen erwünscht sind bin ich in diesem Thread falsch :|

Naja, so sehr unterscheidet sich mein Ausdruck ja nicht von deinem und dem, was hier im Thread sonst so an Schnipseln rumfliegt, und um ehrlich zu sein, war ich diesmal einfach zu faul, den Ausdruck zu erklären. Frei nach Mike Krüger "All what needs to be documented is written in PCRE, and I don't have the time to write it once again in English" :mrgreen:

pajofego 4. Feb 2005 12:06

Re: Frage zu regulären Ausdrücken
 
So danke erst einmal! Ich habe beides versucht und diese funktionieren einwandfrei! :thumb:


Ich bin erst einmal glücklich, dass es funktioniert! Dank der Erklärungen, weiss ich zumindestens was die einzelnen Abschnitte machen, muss aber gestehen, dass die Syntax mir noch zu schaffen macht. :gruebel: Werde mich aber demnächst etwas ausgiebiger mit der Syntax beschäftigen!

Danke und beste Grüße

pajofego


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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