我正在将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)
*/
答案 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]+$