Checkstyle:尾随空格regexp问题

时间:2012-02-01 17:08:58

标签: regex checkstyle

我正在将Checkstyle添加到我的项目中,但检测空格的规则不够好(RegexpSingleline):

(?<=\S)\s+$

它检测尾随空格并忽略仅有空格的行(它应该允许缩进的空行)。它在大多数情况下工作正常,但它使用空行抱怨javadoc / multiline注释:

/**
 * 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 个答案:

答案 0 :(得分:4)

替换原始表达

\s+$

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

管道的左侧在行的开头查找空格,如果它以*开头。 管道的右侧在该行的末尾查找双空格。

修改

与此同时,Eclipse代码格式化程序修复了空JavaDoc行中尾随空格的问题。希望我们再也不必在这里调整Checkstyle regexp;)

答案 1 :(得分:0)

这个怎么样:

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

只有在前面有非空白字符的情况下才会匹配行末尾的空白字符,而该字符也不是该行上唯一的星号。

该正则表达式需要可变长度的lookbehind断言,大多数正则表达式引擎都不支持这种断言。因此,如果这不起作用,则需要匹配整行:

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

并将匹配项替换为\1以删除该行末尾的空格。

答案 2 :(得分:0)

抱歉,我忘记了这个问题。

最后,我最后的正则表达式是:

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

答案 3 :(得分:0)

我们的(较早版本的5.7版)Checkstyle使用xml文件来声明规则并拒绝'&lt;'在@crasp的增强规则中找到的xml值属性(lookbehind标记)中。我提出这个作为替代解决方案,忽略行注释,块注释和空行中的尾随空格。我们的初级开发人员未能定期使用Eclipse格式化程序,他们是尾随空格的常见嫌疑人。此规则指示Checkstyle忽略大部分垃圾:

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