Checkstyle: проблема с регулярным выражением конечных пробелов


Я добавляю 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 6

4 ответа:

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

\s+$

К

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

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

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

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

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

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

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

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

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

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

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

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

(?<!\A[ \t]*\*?)[ \t]$

Наша (более старая - 5.7) версия Checkstyle использует xml-файл для объявления правил и отклоняет '

^(?!(?:[ \t]*?(?:\/?\*\*?|\/\/)[\S \t]+?|[ \t]+$))[\S \t]+[ \t]+$