Domanda

Sto cercando di capire una regex per consentire a me di cercare per una determinata stringa, mentre automaticamente, saltando i commenti.Qualcuno ha un RE come questo o la conosce?Non ha nemmeno bisogno di essere abbastanza sofisticato per saltare #if 0 blocchi;Voglio solo saltare // e /* i blocchi.Le converse, che è la ricerca solo all'interno di blocchi di commento, sarebbe molto utile.

Ambiente:VS 2003

È stato utile?

Soluzione

Questo è un problema più difficile di quanto si possa a prima vista sembrare, dal momento che è necessario prendere in considerazione token di commento all'interno di stringhe, commentare i token che sono essi stessi commentato etc.

Ho scritto una stringa e commento parser per C#, fammi vedere se riesco a scavare qualcosa che vi aiuterà a...Io aggiornerò se trovo qualcosa.

EDIT:...ok, così ho trovato il mio vecchio 'codemasker' progetto.Scopre che l'ho fatto in più fasi, non con un singolo regex.Fondamentalmente mi pollici attraverso un file di origine in cerca di iniziare a gettoni, quando ne trovo una che mi aspetto allora per un fine-token, con maschera e tutto il resto.Questo tiene conto del contesto di partenza token...se si trova un token per "stringa di avvio", quindi si può tranquillamente ignorare commento gettoni fino a trovare la fine della stringa, e viceversa.Una volta che il codice viene mascherato (io ho usato guid come maschere, e una tabella per tenere traccia) quindi si può tranquillamente fare la tua ricerca e sostituzione, poi finalmente ripristinare il mascherato codice.

Speranza che aiuta.

Altri suggerimenti

Essere particolarmente attenti con le stringhe.Spesso delle stringhe sono sequenze di escape che si hanno anche per rispetto, mentre ti stai trovando la fine.

Così ad esempio "This is \"a test\"".Non si può ciecamente cercare un doppio preventivo per terminare.Diffidate anche di `"si tratta di \"`, il che dimostra che non si può semplicemente dire "a meno che i doppi apici è preceduto da un backslash."

In sintesi, fare un po ' brutale unità di test!

Una regexp non è lo strumento migliore per il lavoro.

Perl FAQ:

C; commenti:

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

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

C++ commenti:

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

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

Mi permetto di fare un copia e rimuovere i commenti prima, poi cerca la stringa modo normale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top