Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

03.01.2009, 15:25

Reguläre Ausdrücke - Gutes Tutorial zu Textersetzungen?

Irgendwie habe ich gerade ein Problem mit regulären Ausdrücken im Allgemeinen. Aber erstmal die grundsätzliche Situation. Wer faul ist ignoriert das und springt zur Frage ;)

Situation:
Ich schreibe (bzw werde das tun) einen einfachen Compiler für einen Assembler Dialekt. Ist im wesentlichen nur eine "Textersetzung" von Schlüsselwörtern und dann eine Umwandlung von deren numerischen Parametern ins binäre. Das soll dann z.B. so aussehen:

Quellcode

1
out ENGINE:0:0 255

Zu dem Code: ENGINE:1:0 ist quasi ein define, das vom Compiler ersetzt werden soll durch den ersten Motor und dessen Port 0. Alternativ könnte man die Portnummer auch hardcoden. Allgemein wird hier halt ein Port mit einem Wert belegt.

Nun wollte ich, um das Problem "richtig" anzugehen garnicht erst anfangen einzelne "relevante" Zeichenketten von Hand rauszusuchen, sondern mich auf reguläre Ausdrücke stützen. "Problem" an der Sache ist folgendes:

Der ASM Code ist (möglicherweise, nicht zwingend) inline in XML deklariert. Also in etwa folgendermaßen:

Quellcode

1
2
3
4
5
<SomeNode>
    <CodeNode>
        out ENGINE:1:0 255
    </CodeNide>
</SomeNode>
Das führt dazu, dass der Code teilweise richtig merkwürdig fomatiert ist. Je nachdem wie die XML Datei halt erstellt wurde und eingelesen wird, werden whitespaces mal so und mal so erzeugt / behandelt.

"Super, dass du auf Reguläre Ausdrücke setzen willst" dachte ich mir. "Filterst du halt alle Tabs, Spaces etc. irgendwie sinnig von Hand raus und ersetzt sie durch garnix." Und hab dann angefangen mich dumm und dämlich zu suchen. Mittels regulären Ausdrücken einzelne Zeichenketten rauszufiltern (wie ENGINE:1:0) ist ja nicht das Problem. Aber ich versteh den ganzen Mechanismus der Textersetzungen bei regulären Ausdrücken nicht.

Die eigentliche Frage:
Könnte mich also jemand mit einer guten Seite rund um Reguläre Ausdrücke und Ersetzungen mit solchen versorgen? Ich hab gegoogled und bin auf tausende Blogeinträge etc gestoßen, aber nicht auf sowas wie ein umfassendes Tutorial.

Und falls jemand alles gelesen haben sollte: Ist mein Ansatz irgendwie großer Müll? Hab ich ein "einfaches" Hilfsmittel (bevorzugt C++) übersehen, dass mein Problemstellung eleganter / schneller / besser löst als Reguläre Ausdrücke?

Wenn es von belang sein sollte: Ich werd mich vermutlich auf Boost.Regex stützen. Man könnte einen derart "simplen" Compiler zwar auch als Script realisieren und wäre dann vermutlich sogar schneller fertig, aber dann müsste auf dem kompilierenden PC halt Python, Ruby, PHP / whatever verfügbar sein. Daher "pures" C++.

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

2

03.01.2009, 16:00

auf php.net gibts eine gute erklärung zu regexp welche nicht php-spezifisch ist: http://www.php.net/manual/de/regexp.reference.php

denke, das könnte dir weiterhelfen.

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

03.01.2009, 16:04

Schaut auf den ersten Blick echt ganz gut aus. Behandelt aber soweit ich das nach kurzem drüberlesen sagen kann leider auch keine Textersetzungen :(

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

4

03.01.2009, 16:08

Zitat von »"Das Gurke"«

Schaut auf den ersten Blick echt ganz gut aus. Behandelt aber soweit ich das nach kurzem drüberlesen sagen kann leider auch keine Textersetzungen :(


textersetzung ist einfach mit regexp, dafür gibts den substitude befehl.
als beispiel, um in dem text 'fritz mag c++ nicht' das wort 'nicht' durch 'sehr' zu ersetzten kannst du folgenden code verwenden:

Quellcode

1
s/nicht/sehr/g

erklärung: 's' steht für 'substitude' (ersetzten) und '/' ist ein trennzeichen (da kann man irgend ein zeichen nehmen, das erste was er findet ist für ihn das trennzeichen) und 'g' steht für 'global' (alle vorkommen werden ersetzt. sonst würde nur das 1. vorkommen ersetzt werden)

EDIT: auf unix wird für regexp der befehl 'sed' verwendet, hier hats noch 1-2 beispiele: http://de.wikipedia.org/wiki/Sed_(Unix)

Werbeanzeige