PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RegEx Ausdruck gesucht - Log Parsen


Floyd
04.01.2007, 13:49
Hallo.. ich hoffe das einer von euch mir helfen kann.

Ich bin Anfänger in RegEx versuche jedoch ein konkretes Problem zu lösen:

Undzwar hab ich das Problem das ich ein LogFile parsen muss welches so aussieht: http://blog.freakfabrik.net/QuestHistory.txt

Unabhängig in welcher Gruppe der jeweilige Block steht versuche ich alle Blöcke in einer schleife durchzugehen. Jeder block zieht dabei im Grundsatz zum Beipsiel so aus:


[1] = {
["c"] = "Eisklammtal",
["t"] = "Zwergenausstatter",
["g"] = "Sten Stoutarm",
["la"] = 1,
["i"] = {
[2] = {
["t"] = "Interface\\Icons\\INV_Gauntlets_05",
["l"] = "|cffffffff|Hitem:6171:0:0:0:0:0:0:0|h[Handschuhe des Wolfsjägers]|h|r",
},
[1] = {
["t"] = "Interface\\Icons\\INV_Gauntlets_06",
["l"] = "|cffffffff|Hitem:719:0:0:0:0:0:0:0|h[Handschuhe des Hasenjägers]|h|r",
},
[3] = {
["t"] = "Interface\\Icons\\INV_Gauntlets_04",
["l"] = "|cffffffff|Hitem:2547:0:0:0:0:0:0:0|h[Handschuhe des Eberjägers]|h|r",
},
},
["os"] = {
[1] = {
["t"] = "Zähes Wolfsfleisch: 0/8",
},
},
["pa"] = "Dun Morogh:0.29939755797386:0.71268898248672",
["d"] = "Was haben wir denn hier? Ihr seht aus, als könntet Ihr was brauchen, was Euch die Hände warm hält, hm?\n\nIch sag Euch, was da helfen würde: ein paar schöne, warme Handschuhe. Und weil ich so ein netter Kerl bin, geb ich Euch doch gern so ein Paar. Unter einer Bedingung, versteht sich.\n\nIhr müsst mir etwas Wolfsfleisch besorgen. Ist doch 'n guter Handel, oder? Ihr bringt mir etwas Wolfsfleisch und ich sorge dafür, dass Ihr Euch keine Frostbeulen an den Fingern holt. Na, was sagt Ihr?",
["l"] = 1,
["o"] = "Sten Stoutarm hätte gern 8 Stücke zähes Wolfsfleisch.",
["ta"] = "00:00:01:31",
},


wobei nur 3 Sachen definitiv fest stehen.

1. Jeder Block beginnt mit [<<Zahl>>] = {
2. Jeder Block endet mit },
3. Jeder Block kann unter ["os"] oder ["i"] wieder mit unterblöcken beginnen auf die 1. und 2. zutrifft ... diese blöcken sollen jedoch ignoriert werden !!!!

Ich suche also einen RegEx ausdruck der es mir ermöglich x beliebige anzahlen an blöcken durchzugehen die wie oben aussehen. Wobei die reihenfolge der elemente im block sich ändern kann.

Für die die es interessiert ... Ich verwenden anschließend den RegEx-Ausdruck in der MatchCollectonsklasse des .Net 2.0 Frameworks.

Ich hoffe ihr könnt mir helfen.

Gruß Floyd


smg
04.01.2007, 14:27
Verstehe ich das richtig, dass nur die Blöcke os und i _nicht_ berücksichtigt werden sollen? Dann würde ich sie einfach mit einer Substition eliminieren. :)

Ich kann leider kein .NET und kann dir damit keine fertige Lösung geben, ich habe es eben mit Perl getestet. Das klappt. Hier mal die Pseudoanweisungen, mit denen ich es geschafft habe. :)

Lese Datei in einen String, eliminiere alle Newlines.
Wende ein Regex an Ähnlich diesem: /(?:\["os"\]|\["i"\]).*\},\}/.
Gebe Datei aus.

-- jetzt sind wir fertig.

P.S.: Mir fällt grade auf, dass das ja auch mit dem /m und /s Modifikator, d.h. Multiline Modus und Dot passt auf alles möglich ist, so spart man sich das einlesen der File evt.

eViL_oNe
05.01.2007, 03:03
ich könnte mich ja irren, aber die Logstruktur schreit für mich eher nach etwas Tokenizer/Parser und Composite als nach Sachen, die mit regulären Ausdrücken geschickt abarbeitet werden könnten ;)

Btw, das Ding sieht mir ziemlich verdächtig nach Perl-Deklarationen für Listen und Hashes aus -- mit wenig Konvertierungen könnte man das ganze in gültigen Code überführen ;)

Floyd
05.01.2007, 11:46
problem ist nur das das log nicht von mir kommt

eViL_oNe
06.01.2007, 19:03
problem ist nur das das log nicht von mir kommt

das ist kein Prob -- man kann das Log ja vor der eigenen Bearbeitung in die gewünschte Form bringen ;)

Floyd
06.01.2007, 21:02
solange das automatisiert geht hab ich damit kein problem ^^
handsich ... nein danke. das log wächst auf bis zu 100MB an.. Die pass ich net mit hand an ^^

Gruß Floyd

eViL_oNe
06.01.2007, 21:56
wer spricht denn von einer manuellen bearbeitung???