Checkstyle: проблема регулярных выражений в конце пробела - PullRequest
6 голосов
/ 01 февраля 2012

Я добавляю Checkstyle в свой проект, но правило для обнаружения пробелов недостаточно (RegexpSingleline):

(?<=\S)\s+$

Обнаруживает конечные пробелы и игнорирует строки только с пробелами (допускаются пустые строки с отступами). Большую часть времени он работает нормально, но жалуется на javadoc / многострочные комментарии, используя пустую строку:

/**
 * Some text
 * 
 * More text
 */

Пустая строка между двумя строками - это «звездочка-пробел» (форматирование Eclipse по умолчанию), что вызывает правило, и до сих пор я не мог заставить его игнорировать эту особую ситуацию. Как я могу исправить это регулярное выражение для этого случая?

Спасибо!

Примечание: это не обязательно должна быть многострочная проверка и проверка, действительно ли строка является частью комментария, она достаточно хороша как одна строка.


Обобщение желаемых правил ...

Регулярное выражение должно соответствовать строкам с завершающими пробелами:

x = y;     
void function() { 

За исключением случаев, когда в строке ничего нет, кроме пробелов (в этом исключении допускается только одна звездочка перед последним пробелом, но ТОЛЬКО когда звездочка является единственным непробельным символом):

(only whitespaces here, all ok)
/**
 * (this text is not here, and this line is ok - this case is my uncovered situation)
 */

Ответы [ 4 ]

4 голосов
/ 27 августа 2012

Заменить исходное выражение

\s+$

на

(?<!\*)\s+$|\*\s\s+$

Левая сторона канала ищет пробелы в начале строки, если она начинается с *.Правая сторона канала ищет двойные пробелы в конце строки.

Редактировать:

Тем временем средство форматирования кода Eclipse исправило проблемуконечные пробелы в пустых строках JavaDoc.Надеюсь, нам никогда не придется снова настраивать регулярное выражение Checkstyle;)

0 голосов
/ 01 августа 2016

Наша (более ранняя - 5.7) версия Checkstyle использует xml-файл для объявления правил и отклоняет '<' в атрибуте значения xml (токене lookbehind), найденном в расширенном правиле @crasp.Я придумал это как альтернативное решение, чтобы игнорировать конечные пробелы в комментариях строк, комментариях блоков и пустых строках.Наши младшие разработчики не могут регулярно использовать форматировщик Eclipse, и они являются обычными подозреваемыми для конечных пробелов.Это правило указывает Checkstyle игнорировать большую часть этого мусора: </p>

^(?!(?:[ \t]*?(?:\/?\*\*?|\/\/)[\S \t]+?|[ \t]+$))[\S \t]+[ \t]+$
0 голосов
/ 10 сентября 2012

Извините, я забыл об этом вопросе.

В конце концов, мое последнее выражение было таким:

(?<!\A[ \t]*\*?)[ \t]$
0 голосов
/ 01 февраля 2012

Как насчет этого:

(?<=\S)(?<!^\s*\*)\s+$

соответствует пробелу в конце строки, только если ему предшествует символ без пробела, который также не является единственной звездочкой в ​​строке.

Это регулярное выражение требует проверочных утверждений переменной длины, которые большинство механизмов регулярных выражений не поддерживают.Поэтому, если это не сработает, вам нужно сопоставить всю строку:

^(?!\s*(?:\*\s+)?$)(.*?)\s+$

и заменить совпадения на \1, чтобы удалить пробел в конце строки.

...