简单(我认为)场景需要正则表达式帮助

时间:2011-08-19 07:02:56

标签: java regex checkstyle

从不擅长这些事情。我们使用Checkstyle(for Java)来强制执行良好的编码实践。我们想要添加的一项新检查是通过使用正则表达式检查来确定何时(可能)错误地使用某个API。

不正确的用法示例:

BigDecimal.valueOf(someDouble).setScale(3);
someBigDecimalObject.setScale(6);

正确的用法示例:

BigDecimal.valueOf(someDouble).setScale(3, RoundingMode.HALF_UP);
someBigDecimalObject.setScale(1, RoundingMode.HALF_DOWN);

所以,我正在寻找的正则表达式是“.setScale(”出现在代码中“RoundingMode。”出现在它之后的某个地方。或者为了增加更多的清晰度,当“.setScale”时,正则表达式应为true。 (“出现但是”RoundingMode。“没有。

提前致谢

3 个答案:

答案 0 :(得分:1)

您可以使用正则表达式:

\.setScale\(\d+,\s*RoundingMode

See it

答案 1 :(得分:1)

怎么样:

\.setScale\(.+RoundingMode

答案 2 :(得分:1)

脱离我的头顶:

(?x: \.setScale \s* \(  (?: (?! \bRoundingMode\b ) [^)] ) * \) )

您想要的是.setScale(...)其中...不包含RoundingMode。进一步解释(假设正在使用Java处理正则表达式):

(?x: - 引入“空白”模式,以便您可以使用空格填充正则表达式以便于阅读 \.setScale \s* \( - 使用任意空格查找.setScale,然后( 现在真正的乐趣开始了:在每个位置,直到我们遇到尾随)检查单词RoundingMode是否出现:
(?: - 开始一个包含...的组 (?! \bRoundingMode\b ) - ...单词RoundingMode的负向前瞻声明,也就是说,如果检测到“RoundingMode”,正则表达式将无法匹配;然后
[^)] - 匹配非)字符
) * - 根据需要经常重复上述内容 \) - 检测到结束“)” ) - 最后,关闭(?x:构造。

当然,如果在方法调用中有嵌套的(...)表达式但是你无法使用Java模式解决这个问题,那么这将不起作用,你需要一个dodgy Perl正则表达式代替