Größeres Problem mit RegExpr. ... Jochen ? ;-)

Post Reply
Message
Author
regexp

Größeres Problem mit RegExpr. ... Jochen ? ;-)

#1 Post by regexp »

Folgende Vorgabe:

Ein string soll nach beinhaltetem „#col“ durchsucht und der darauf folgende string ausgegeben werden… wie folgt.

-Wenn nach #col ein Leerzeichen steht, dann prüfe die darauffolgenden 6 Zeichen, wenn kein Leerzeichen steht, dann prüfe die unmittelbar auf #col folgenden 6 zeichen.
#colFF00aa3245 dfjh == color = „FF00aa“
#col FF00aa3245 dfjh == color = „FF00aa“

-Wenn diese 6 Zeichen HEX sind ([a-fA-F0-9), dann gib sie aus, wenn nicht, dann gib Wort bis zum nächsten Leerzeichen aus
#colFF00aa3245 dfjh == color = „FF00aa“
#collightblue dada == color = “lightblue”
#colred dadada == color = „red“
#colaffe dadada == color = „affe“

- Wenn diese 6 Zeichen HEX sind ([a-fA-F0-9), dann gib sie aus, wenn nicht, dann gib Wort bis zum nächsten Leerzeichen aus

WICHTIG “#” ist nicht der Anfang des Eingabestrings, so sollte

dadada#colFF00aa3245 dfjh == color = „FF00aa“

auch funktionieren.


schonmal DANKE für jeden denkanstoß

Jochen

Re: Größeres Problem mit RegExpr. ... Jochen ? ;-)

#2 Post by Jochen »

Also, ich fühl mich jetzt einfach mal angesprochen... <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> (Hättest aber auch den alten Thread weiterführen können.)

Immer wenn es so komplex wird, wird man auf die Extended Regexps umsteigen müssen bzw. auf ein Tool, dass diese beherrscht. Mein Favorit ist da immer noch der awk.

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
awk '
match ($0 , /#col([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]| *[^ ]+( |$))/) {
color = substr ($0, RSTART+4, RLENGTH-4)
sub (/^ */, color)
print color
}'
</font><hr></pre></blockquote>Der RE benutzt mittels "|" zweimal Alternativen: Entweder Hex-Angabe oder Wort, und Wort gefolgt von Blank oder Zeilenende. Ansonsten wird der Treffer aus $0 herauskopiert (ohne "#col", eventuell führende Blanks gelöscht und das Endresultat ausgegeben. Tipp am Rande: Regexps sind nicht abtippfreundlich, also benutze besser Cut'n'Paste.

Habe ich damit das Problem erlegt, oder habe ich was falsch verstanden?

Jochen

regexp

Re: Größeres Problem mit RegExpr. ... Jochen ? ;-)

#3 Post by regexp »

hi Jochen .. erstmal DANKE für die Antwort.

irgendwie versuche ich das Problem im Moment mit php umzusetzen.
Hättest du evtl. eine Idee, wie dies in C(++) aussehen könnte ? :)

regexps habe ich bisher mit egrep gemacht.

nochmals DAAANKE

Jochen

Re: Größeres Problem mit RegExpr. ... Jochen ? ;-)

#4 Post by Jochen »

Tjaaa... PHP ist mein Persönliches Hoffnungsloses Problem <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">. Zu deutsch, ich kann es nicht, brauche es aber auch nicht und ist daher auf die gaaanz lange Bank geschoben. Aber wenn PHP in irgendeiner Library den Umgang mir Regexps mitbringt, wäre es nur eine Sache des Manual-Page-Durchforstens, welche Regexps von PHP unterstützt werden und welche Funktionen dazu existieren. Vielleicht kann Dir da ja jemand anders einen Tipp geben.

Betreffs C++ kann ich (auch) keine genaue Aussage treffen (vielleicht hat ja <a href="http://freshmeat.net" target="_blank"><!--auto-->http://freshmeat.net</a><!--auto--> was?). Aber für C gibt es in der glibc die Funktionen regcomp(), regexec(), regerror() und regfree(). Wie üblich hilft ein "man regcomp" weiter.

Und egrep bringt Dich hier auf die Dauer nicht weiter. Regexps sind nur Muster, die Zeichenketten bestimmter Art beschreiben. Wenn eine Zeichenkette auf einen Regexp passt, kommt es auf das Programm an, welches die Regexps anwendet, was dann passiert. Und egrep gibt bei Treffer halt immer die ganze Zeile aus und ist damit nicht das richtige Tool für Deine Anforderung.

Jochen

regexp

Re: Größeres Problem mit RegExpr. ... Jochen ? ;-)

#5 Post by regexp »

hi jochen,

wie bei dir php, so ist bei mir awk das Problem <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">.
PHPliefert librarys, mit denen ich REs verwenden kann. Die Erstellung und das TEsten habe ich mit eifnachen REs immer mit egrep gemacht. Nur komme ich in diesem Falle damit nicht weiter (hätte ja auch ein syntax-problem sein können)

Zu meinem Problem:

danke für den Code noch einmal,
aber wenn ich "#col ffaabbccdd" eingebe so erscheint dann als Ausgabe: " ffaabbccdd" <- ein HEX mit ANführendem Leerzeichen und länger al 6 stellen.
Bei HEX soll er allerdings nach der 6 Stelle cutten und ein evtl. führendes leerzeichen soll weg.

Kann man das mit RegExp gleich machen ? Oder komme ich um einzelnes Zerlegen und Abfragen nicht herum ?
Man könnte natürlich fallunterscheiden, ob anführendes Leerzeichen existiert oder wenn HEX-wert da ist, dann cut nach der 6. Stelle (will es ja in Farbwerten weiterverarbeiten)

nochmals Riesen-DANKE <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Jochen

Re: Größeres Problem mit RegExpr. ... Jochen ? ;-)

#6 Post by Jochen »

Hi, mal wieder!

Sorry, hatte diesen Thread schon aus den Augen verloren. Das angesprochene Problem habe ich nicht bedacht: Wenn eine Folge von Hex-Ziffern länger als 6 Ziffern auftaucht, wird über die 2. Variante getroffen, da die Regexps immer einen möglichst langen Treffer abdecken wollen. Gehe am besten so vor, dass Du mittels Deiner php-Funktionen eine Zeile einfach mehrfach auf Treffer überprüfst. Die Regexps wären dann "#col *[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]" und "#col *[^ ]+( |$)". Die Regexp-Funktionen müssen dann irgendwelche Mittel bieten, die Zeichenketten, auf die die regexpe passen, zu identifizieren, damit man sie mit handelsüblichen Zeichenketten-Funktionen herauskopieren und weiterbehandeln kann.

Mit den o.a. Regexps dürfte das Problem mit den zu langen Treffern nicht mehr auftauchen. Weiter kann ich Dir aber nicht mehr helfen, da ich wie gesagt PHP nicht kenne.

Jochen

Post Reply