正则表达式适用于在线验证器但在 java checkstyle 中失败

regex works on online validator but fails in java checkstyle

我目前是第一次使用 checkstyle,遇到了一些小问题。 我希望 checkstyle 验证包声明和后续内容之间是否有一个空行。 我找不到提供这种验证的模块,或者至少 none 也不会检查包声明和上面的内容之间是否有空行。

所以我决定使用 regexp-module 并编写一个正则表达式来实现这种验证。我试图涵盖我的规则的所有可能的错误,并且在一些在线验证器中你可以尝试你的正则表达式它没有问题。

这是正则表达式:

.+package.*;|package.*;.*\S|package.*;.*[\r\n].*\S|package.*;[\r\n]{3,}

现在,当我尝试在我的检查配置中导入它时,我总是收到消息 即使代码正确,我的规则也被违反了。

这里有一些示例代码:

package just.some.package;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
...

通常这段代码不会引发任何问题,但只要我在我的 IDE 中的 checkstyle 插件中尝试它,它总是会引发任何问题。导致问题的正则表达式片段似乎是这个:

package.*;(\r|\n){3,}

它应该只检查包声明后是否有两个以上的换行符,但如果恰好有两个,就像示例中一样,它也会触发错误。

谁能解释一下这是什么问题?

谨致问候

德姆利

您可以使用 \R construct 来匹配换行符,

package.*;\R{3,}

[\r\n]{3,}(\r|\n){3,} 都匹配,因为你有 CRLF 结尾,这意味着两行之间有 4 个 CR/LF 个字符,用空行分隔。

或者,如果您使用 Windows 行结束样式,您可以指定 (?:\r\n){3,} 模式。