Hello
Справочная информация:
Я использую Checkstyle 4.4.2 с модулем проверки RegExp, чтобы определить, не совпадают ли имена файлов в исходных заголовочных файлах java с именем файла класса или интерфейса, в котором они находятся. Это может произойти, когда разработчик копирует заголовок из одного класса в другой и не изменяет тег «File:».
Использование регулярного выражения в проверщике RexExp прошло через много воплощений и (хотя на данном этапе это, возможно, излишне) выглядит так:
File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)
Базовая форма проверяемых (хотя и очень упрощенных) файлов выглядит так
/*
*
* Copyright 2009
* ...
* File: Bar.java
* ...
*/
package foo
...
import ..
...
/**
* ...
*/
public class Bar
{...}
Проблема:
Когда совпадений не найдено (т.е. когда заголовок, содержащий «File: Bar.java» копируется в файл Bat.java), я получаю StackOverflowError для очень длинных файлов (мой тестовый пример - @ 1300 строк).
Я экспериментировал с несколькими визуальными тестерами регулярных выражений и вижу, что в несоответствующем случае , когда механизм регулярных выражений проходит строку, содержащую имя класса или интерфейса, он начинает поиск снова на следующей строке и выполняет некоторый возврат, что, вероятно, вызывает StackOverflowError
Вопрос:
Как предотвратить StackOverflowError, изменив регулярное выражение
Есть ли способ изменить мое регулярное выражение так, чтобы в несоответствующий регистр (т.е. когда заголовок, содержащий "File: Bar.java", копируется в файл Bat .java), что сопоставление прекратится, как только он проверит строку, содержащую имя интерфейса или класса, и обнаружит, что «\ 1» не соответствует первой группе.
В качестве альтернативы, если это можно сделать, возможно ли минимизировать поиск и сопоставление, которое происходит после проверки строки, содержащей интерфейс или класс, минимизируя таким образом обработку и (надеюсь) ошибку StackOverflow?