Java - expression régulière trouvant des commentaires dans le code
Un peu plaisir avec Java cette fois. Je veux écrire un programme qui lit un code de l'entrée standard (ligne par ligne, par exemple), comme:
//some comment
class Main {
/* blah */
///* foo
foo();
//foo */
foo2();
/* //foo2 */
}
trouve tous les commentaires et les supprime. Je suis en train d'utiliser des expressions régulières, et pour l'instant j'ai fait quelque chose comme ceci:
private static String ParseCode(String pCode)
{
String MyCommentsRegex = "(?://.*)|(/\\*(?:.|[\\n\\r])*?\\*/)";
return pCode.replaceAll(MyCommentsRegex, " ");
}
mais il semble ne pas fonctionner pour tous les cas, par exemple:
System.out.print("We can use /* comments */inside a string of course, but it shouldn't start a comment");
Des conseils ou des idées différentes de regex?
Merci à l'avance.
source d'informationauteur brovar
Vous devez vous connecter pour publier un commentaire.
Vous avez déjà renoncé à cela maintenant, mais j'ai été intrigué par le problème.
Je crois que c'est une solution partielle...
Natif de la regex:
En Java:
Cela semble gérer correctement les commentaires intégrés dans des chaînes ainsi que des échappées guillemets à l'intérieur des chaînes de caractères. J'ai jeté quelques choses à pour vérifier mais pas de manière exhaustive.
Il y a un compromis que "toutes les" blocs dans le code va se retrouver avec un espace après. Garder ce simple et la résolution de ce problème sera très difficile compte tenu de la nécessité de proprement de la poignée:
Une simple Correspondance.trouver/appendReplacement boucle peut conditionnellement vérifier pour le groupe(1) avant de les remplacer par un espace et ne serait plus qu'une poignée de lignes de code. Encore plus simple qu'un seul analyseur, peut-être. (Je pourrais ajouter au comparateur de boucle trop si quelqu'un est intéressé.)
Le dernier exemple n'est pas un problème je pense:
... parce que le commentaire se termine effectivement avec
"We can use */
. Ce code ne compile pas.Mais j'ai un autre cas problématique:
Votre modèle se transformer en l':
...qu'est-ce que le code non valide. Afin de mieux de remplacer vos commentaires avec
" "
au lieu de""
.Je pense qu'un 100% solution correcte à l'aide des expressions régulières est soit inhumains ou impossible (en tenant compte des évasions, etc.).
Je crois que la meilleure option serait d'utiliser ANTLR - je crois qu'ils fournissent même un Java de grammaire que vous pouvez utiliser.
J'ai fini avec cette solution.
Une autre alternative est d'utiliser une bibliothèque de soutenir AST analyse, par exemple, pour org.eclipse.jdt.de base a toutes les Api que vous devez faire cela et plus encore. Mais alors que c'est juste une solution de rechange:)