Bonjour,StackOverflowError avec Checkstyle 4.4 RegExp chèque
Contexte:
J'utilise Checkstyle 4.4.2 avec un module de vérification de RegExp pour détecter lorsque le nom de fichier dans les en-têtes source sur java faire ne correspond pas au nom de fichier de la classe ou de l'interface dans laquelle ils résident. Cela peut se produire lorsqu'un développeur copie un en-tête d'une classe à une autre et ne modifie pas la balise "File:".
L'utilisation régulière d'expression dans le vérificateur RexExp a été par beaucoup d'incarnations et (si elle est peut-être exagéré à ce stade) ressemble à ceci:
File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface)\1)
La forme de base des fichiers Je vérifie (bien que beaucoup simplifiée) se présente comme suit
/*
*
* Copyright 2009
* ...
* File: Bar.java
* ...
*/
package foo
...
import ..
...
/**
* ...
*/
public class Bar
{...}
Le problème:
Lorsque aucune correspondance trouvée, (c.-à-d. quand un en-tête contenant "File: Bar.java" est copié dans le fichier Bat.java), je reçois un StackOverflowError sur des fichiers très longs (mon test est @ 1300 lignes).
Je l'ai expérimenté avec plusieurs testeurs d'expression réguliers visuels et peut voir que dans le cas non-appariement lorsque le moteur regex passe la ligne contenant le nom de la classe ou de l'interface, il commence la recherche à nouveau sur la ligne suivante et fait certains retours en arrière qui provoque probablement le StackOverflowError
la question:
Comment éviter la StackOverflowError en modifiant l'expression régulière
Existe-t-il un moyen de modifier mon expression régulière de telle sorte que, dans le cas , le cas non correspondant (c.-à-d. quand un en-tête contenant "File: Bar.java" est copié dans le fichier Bat.java) que la correspondance s'arrête une fois qu'elle examine la ligne contenant l'interface ou le nom de classe et voit que "\ 1" ne correspond pas au premier groupe. Est-il possible de minimiser la recherche et l'appariement après avoir examiné la ligne contenant l'interface ou la classe, minimisant ainsi le traitement et (espérons-le) l'erreur StackOverflow?
Avez-vous dépassé la pile de google et obtenu ce site? –
Non, j'ai lu Coding Horror depuis le début, donc je le savais; juste n'ai pas eu une bonne question jusqu'à maintenant. – jtsampson