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 ответа:
Заменить исходное выражение
\s+$
К
(?<!\*)\s+$|\*\s\s+$
Левая сторона трубы ищет пробелы в начале строки, если она начинается с *. Правая сторона трубы ищет двойные пробелы в конце строки.
Редактировать:
Тем временем, форматер кода Eclipse исправил проблему с конечными пробелами в пустых строках JavaDoc. Надеюсь, нам никогда не придется снова корректировать регулярное выражение Checkstyle;)
Как насчет этого:
(?<=\S)(?<!^\s*\*)\s+$
Соответствует пробелу в конце строки только в том случае, если ему предшествует символ без пробела, который также не является единственной звездочкой в строке.
Что регулярное выражение требует утверждения lookbehind переменной длины, которые большинство движков регулярных выражений не поддерживают. Поэтому, если это не сработает, вам нужно сопоставить всю строку:
^(?!\s*(?:\*\s+)?$)(.*?)\s+$
И замените совпадения на
\1
, чтобы удалить пробелы в конце строки.