|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Problem mit Look-ahead-Behauptung
|
Seitenanfang |
| Hallo allerseits! Ich möchte in einem mit SGML-Markup versehenen Text allen Inhalt, der mit Kommentar-Tags versehen ist (die hier die Form <[&OX]> ... </[&OX]> haben) ebenso in spitze Klammern setzen. Für Zeilen, in denen sowohl das öffnende als auch das schließende Tag enthalten ist, habe ich schon diesen Ausdruck, der soweit auch funktioniert: s:<([&])>( ?)([^(</&>)\n]*):<$1>$2<$3>:g; Allerdings gibt es auch die Möglichkeit, dass ein öffnendes Tag in einer Zeile steht, evtl. noch Inhalt danach, und das schließende Tag erst in der nächsten oder einer späteren Zeile folgt. Diesen Fall wollte ich abfangen, indem ich nach dem öffnenden Tag suche, evtl. gefolgt von Text, dem allerdings NICHT das schließende Tag folgt. Danach die nächsten Zeilen so lange vollständig in <> packen, bis das schließende Tag erkannt wird. Dafür wollte ich die Look-ahead-Behauptung (?!</[&OX]>) benutzen, um zu überprüfen, dass auch nur die Zeilen in <> gesetzt werden, die kein schließendes Tag enthalten (denn der erste Ausdruck würde das ja schon erledigen). Sieht bislang so aus, funktioniert aber nicht... ;-) s:<([&OX])>( ?)(.*)(?!</\1>):<$1>$2<$3>:g; Wahrscheinlich kann man beide Überprüfungen auch in einen Regexp stecken, aber ich hänge schon hier fest... Wenn ich den Ausdruck so wie oben schreibe (meine jetzt einen Test ausschließlich für den zweiten Ausdruck), macht mir das Programm auch aus <&> ... </&> ein <&> <... </&>>. Wenn ich die Suche nach beliebigen Zeichen etwas weniger gierig machen möchte (.*?) werden die Zeilen zu <&> <>... </&>. Abgesehen von dieser falschen Klammersetzung wurde natürlich auch noch die Look-ahead-Behauptung überhaupt nicht beachtet (denn um vollständige Zeilen sollte sich ja nur der erste Ausdruck kümmern). Was mache ich da falsch? Danke für eure Hilfe und Entschuldigung für zu viel Text... ;-) chris
Datum: 16.08.2007-11:34

|
re: Problem mit Look-ahead-Behauptung
|
Seitenanfang |
| Hallo! Der einzigste Unterschied zwischen Fall 1 (alles in einer Zeile) und Fall 2 (mehrere Zeilen) ist doch eigentlich, dass da noch ein paar Zeilenumbrüche rumhängen, die von . im RA per default nicht erfasst werden. Häng mal noch den Parameter 's' mit an den für eine Zeile funktionierenden RA, vlt. geht's dann schon. Grüße, Skrilax
Datum: 16.08.2007-16:05

|
re: Problem mit Look-ahead-Behauptung
|
Seitenanfang |
| Ok, vermutlich eher nicht, wie ich grad sehe... Dann lieber deinen zweiten Regexp, sind nur noch ein paar Denkfehler drin:
s:<([&OX])>(.*?)(?=</\1>): ... :gs; Der Parameter s sorgt dafür, dass auch Zeilenumbrüche vom Punkt (.) erfasst werden. und es sollte ein positiver Look-ahead sein, der Schlusstag soll schließlich genau da dann stehen. Damit sollten beide Fälle (nur eine Zeile bzw. mehrere Zeilen) erschlagbar sein. Hab nur noch nicht ganz verstanden wie die Ersetzung aussehen soll... ;)Grüße, Skrilax
Datum: 16.08.2007-16:26

|
re: Problem mit Look-ahead-Behauptung
|
Seitenanfang |
| Danke für deine Antwort! Problem ist nur, dass Zeilenumbrüche gerade nicht erfasst werden sollen. Mal kurz die möglichen Situationen:
<&> vollständige Tags in einer Zeile </&>
Hier könnte es auch passieren, dass die Tags und inhalt mal ohne Leerzeichen aufeinander folgen.Und dann Situationen wie diese:
<&> ... ... ... </&>
oder
<&> ... </&>...oder Kombinationen daraus... Dabei soll der Inhalt jeweils zeilenweise in <> gesetzt werden, also etwa [code] <&> <hier geht's los> <hier geht's weiter> <Ende> </&> Sieht leider nicht so aus, als würde dein Vorschlag funktionieren, denn es ergibt zwar [code] <&> <bla ></&>
aber bei über mehrere Zeilen aufgeteilten Einträgen passiert nichts:
<&> schließendes Tag in nächster Zeile </&>
Deshalb bin ich auch bei zwei RAs angekommen: Einer, der "vollständige" (öffnende+schließende Tags) in einer Zeile findet. Der andere, der öffnende Tags erkennt, denen evtl. noch in dieser Zeile Inhalt folgt. Nachdem Ausdruck #2 erkannt wurde, müsste dann jede folgende Zeile vollständig in <> gesetzt werden, bis (evtl. Inhalt) + schließendes Tag folgen. Daher auch die negative look-ahead-Behauptung, um beliebige Zeichenketten, so lange KEIN schließendes Tag folgt, zu erkennen.... Schon wieder so viel Text. ;-) Grüße Chris
Datum: 16.08.2007-19:57

|
re: Problem mit Look-ahead-Behauptung
|
Seitenanfang |
| Hallo! Ahja, jetzt hab ich überhaupt erstmal verstanden, was genau gemacht werden soll. Ich hab da mal noch was gebastelt:
s#<([OX&])>( *)(.+?)( *)</\1>#"<$1>$2".(join "\n" => map { /\S/?"<$_>" : '' } split "\n" => $3)."$4</$1>"#gse; Funktioniert leider noch nicht ganz perfekt, er unterschlägt ganz gerne einen Zeilenumbruch, wenn der Endtag in einer eigenen Zeile steht. Aber es ist ja schon mal ein Anfang.Grüße, Skrilax
Datum: 16.08.2007-22:58

|
re: Problem mit Look-ahead-Behauptung
|
Seitenanfang |
| Danke für deine Hilfe, Skrilax! Ist jetzt aber doch ganz anders gekommen als geplant. Das Programm, das auf die veränderte Textdatei zugreift, kommt anscheinend doch damit zurecht, wenn einfach irgendwo eine öffnende spitze Klammer steht... und vielleicht auch erst Zeilen später die schließende. Konnte überraschenderweise auf das Programm selbst zurückgreifen und ein paar Dinge durchtesten. Damit sind wird also wieder zurück bei den Basics...
s#<([&OX])#<$1> <#g; s#</([&OX])>#> </$1>#g;
fertig. schrecklich. ;-)
Datum: 22.08.2007-18:15

|
|

|

|

|
 |

|

|
|