我正在将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)
*/
替换原始表达式
s+$
至
(?<!*)s+$|*ss+$
如果管道以*开头,则管道的左侧会在该行的开头查找空白。管道的右侧在管线末端寻找双空白。
编辑:
同时,Eclipse代码格式化程序修复了空JavaDoc行中尾随空格的问题。希望我们再也不用在这里调整Checkstyle regexp了;)
这个怎么样:
(?<=S)(?<!^s**)s+$
匹配行末尾的空白,前提是该行前面有一个非空白字符,该字符也不是行上唯一的星号。
该正则表达式需要可变长度的lookbacking断言,而大多数正则表达式引擎不支持这种断言。因此,如果这不起作用,你需要匹配整个行:
^(?!s*(?:*s+)?$)(.*?)s+$
并且用CCD_ 1替换匹配以去除行末尾的空白。
对不起,我忘了这个问题。
最后,我的最后一个正则表达式是:
(?<!A[ t]**?)[ t]$
我们的Checkstyle(旧版-5.7)版本使用xml文件来声明规则,并拒绝'<'在@crasp在增强规则中找到的xml值属性(lookbacking令牌)中。我提出了这个替代方案来忽略行注释、块注释和空行中的尾随空白。我们的初级开发人员无法定期使用Eclipse格式化程序,他们通常会怀疑后面的空白。这个规则指示Checkstyle忽略大部分垃圾:
^(?!(?:[ t]*?(?:/?**?|//)[S t]+?|[ t]+$))[S t]+[ t]+$