Frage

Ich habe versucht, einen regulären Ausdruck zu finden, der es mir ermöglicht, nach einer bestimmten Zeichenfolge zu suchen und gleichzeitig Kommentare automatisch zu überspringen.Hat jemand so ein RE oder kennt eines?Es muss nicht einmal ausgereift genug sein, um es zu überspringen #if 0 Blöcke;Ich möchte nur, dass es überspringt // Und /* Blöcke.Das Umgekehrte, also nur die Suche innerhalb von Kommentarblöcken, wäre ebenfalls sehr nützlich.

Umfeld:VS 2003

War es hilfreich?

Lösung

Dies ist ein schwierigeres Problem, als es zunächst erscheinen mag, da Sie Kommentar Token innerhalb von Zeichenketten berücksichtigen müssen, Kommentar-Token, die sich kommentiert werden aus etc.

ich einen String und Kommentar-Parser für C # geschrieben, lassen Sie mich sehen, ob ich etwas ausgraben kann, die helfen ... Ich werde aktualisieren, wenn ich nichts finden.

EDIT: ... ok, so fand ich mein altes 'codemasker' Projekt. Es stellte sich heraus, dass ich tat dies in den Stadien, nicht mit einem einzigen regulären Ausdruck. Im Grunde mir eine Quelldatei Zoll bis zum Start Token suchen, wenn ich einen finde ich dann für ein End-Token aussehen und Maske alles dazwischen. Dies berücksichtigt den Kontext der Start-Token ..., wenn Sie ein Zeichen für „string Start“ finden, dann können Sie sicher Kommentar Token ignorieren, bis Sie das Ende der Schnur, und umgekehrt finden. Sobald der Code maskiert ist (I guids als Masken verwendet, und eine Hash-Tabelle Spur zu halten), dann können Sie sicher Ihre Suche tun und zu ersetzen, dann schließlich die maskierten Code wiederherzustellen.

Ich hoffe, das hilft.

Andere Tipps

Seien Sie besonders vorsichtig mit Streichern. Strings haben oft Escape-Sequenzen, die Sie müssen auch respektieren, während Sie das Ende von ihnen sind zu finden.

So z.B. "This is \"a test\"". Sie können nicht blind suchen Sie nach einem doppelten Anführungszeichen zu beenden. Vorsicht vor auch `` „Das ist \“ `, was zeigt, dass man nicht einfach sagen kann,„es sei denn, doppelte Anführungszeichen durch ein Backslash.“

Zusammenfassend einige brutalen Unit-Tests machen!

Ein regulärer Ausdruck ist nicht das beste Werkzeug für den Job.

Perl FAQ :

C Kommentare:

#!/usr/bin/perl
$/ = undef;
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print; 

C ++ Kommentare:

#!/usr/local/bin/perl
$/ = undef;
$_ = <>;

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;

Ich möchte eine Kopie machen und zunächst die Kommentare abzustreifen, dann den regulären Weg, um die Zeichenfolge suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top