regex可在在线验证器上运行,但在Java Checkstyle中失败

时间:2018-06-20 13:35:07

标签: java regex checkstyle

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

因此,我决定使用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插件中尝试它,它便会始终执行。引起问题的regexp的片段似乎就是这样的:

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

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

有人可以向我解释问题是什么吗?

最诚挚的问候

Demli

1 个答案:

答案 0 :(得分:1)

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

package.*;\R{3,}

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

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