PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei RegExp



axeljaeger
11-05-2004, 17:37
Hallo,
ich versuche jetzt seit zwei Tagen einen regulären Ausdruck zu basteln, der folgende Eigenschaften hat:

Er soll auf ein NewLine (\n) passen, wenn vor dem newLine KEIN Backslash war, der das newline escaped, aber doch,
wenn zwei Backslashes davor sind ( Backslash wird escaped ).

Mein Versuch dazu sieht so aus:


^(?!\\) *\n$

Der hat den Nachteil, dass er nie passt.

Dabei hab ich mir gedacht: (?!\\) sagt ja, wenn kein Backslash vor Leerzeichen beliebiger Menge links vom newline ist. Das sind zwei Backslashes, weil das aus einem C++-Quelltext ist. Nicht das sich jemand wundert. Das der Backslash escaped werden kann, ist in dem Ansatz noch nicht mit drinn.
Ich bin neben der korrekten Lösung für das Problem auch an meinem Denkfehler interessiert, um sowas zukünftig selber lösen zu können. Als Anleitung hab ich die Beschreibung von QRegExp benutzt. Vielleicht ist die nicht so der Hit.


Vielen Dank im Vorraus.

Badsteve
11-05-2004, 18:05
so:


/(?<!\\)\\n/

die '\n' stehen doch als '\n' in der Datei.

steve

axeljaeger
11-05-2004, 18:37
Ich danke dir, wüsste aber jetzt gerne noch etwas mehr: Was heist / irgendwas / ? Also zwei Slashes um den Ausdruck? was heist das kleiner-Zeichen hinter dem Ausrufezeichen?

Badsteve
11-05-2004, 18:43
also mit den "/" werden sie Regexes in Perl eingefasst.



(?<!\\)


das ist ein negatives lookbehind. Also wenn '\n' gefunden wird wird noch geguckt, dass das was darin steht nich vorkommt. (Also das \\)

steve

axeljaeger
12-05-2004, 07:55
Oh, ich glaube dann konnte das gar nicht klappen: Ich will das Ding von Qt fressen lassen und da hab ich in der Doku nichts von dem < gefunden. Die Slashes hab ich schonmal versucht wegzulassen, es hat trotzdem nicht so ganz geklappt. Ich hab jetzt eine Lösung, die genau das Gegenteil von dem macht, was ich haben will:
\\\\\\s*\\n. Ich suche also nach einem Backslash, danach beliebigem Whitespace und dann nach einem linefeed. Das funktioniert, ist halt nur wie gesagt verkehrt herum: Sagt ja, wenn er ein falschen return gefunden hat und nein, wenn er ja sagen sollte. Das Problem ist wohl schon etwas kniffliger: Wenn ich einfach nach "keinem backslash, beliebigem Whitespace und dann linefeed" suche, findet er das immer: Ein Whitespace ist ja auch kein Backspace.

Ich hab meine Anforderungen nochmal leicht verändert: Hintergrund der Geschichte ist: Ich möchte schauen, ob eine C++ Preprozessor Befehl mit dem Ende der Zeile abgeschlossen ist, indem ich die RegExp drauffallen lasse. Jetzt hab ich aber herausgefunden, dass man den Backslash selber nicht escapen kann, soll heißen, was ich am Anfang geschrieben habe von wegen zwei Backslashes gelten auch nicht, muss ich wieder zurückziehen. Es ist alllerdings erlaubt, zwischen Backslash und return whitespace zu haben, auch wenn das der G++ mit einer Warning versieht.