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

标签 java regex checkstyle

从来不擅长这些事情。我们使用 Checkstyle(适用于 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.” 不出现。

提前致谢

最佳答案

从我的头顶上下来:

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

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

(?x: - 引入“空白”模式,以便您可以用空格填充正则表达式以提高可读性
\.setScale\s*\( - 查找带有任意空格的 .setScale,然后 (
现在有趣的事情真正开始了:在遇到尾随 ) 之前的每个位置,检查单词 RoundingMode 是否出现:
(?: - 启动一个包含...的组
(?!\bRoundingMode\b ) - ...单词 RoundingMode 的否定前瞻断言,也就是说,如果检测到“RoundingMode”,则正则表达式将无法匹配;然后
[^)] - 匹配非 ) 字符
) * - 根据需要多次重复上述操作,直到
\) - 检测到结束符“)”。
) - 最后,关闭 (?x: 构造。

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

关于java - 简单(我认为)场景需要正则表达式帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7118050/

相关文章:

java - Controller 中的错误身份验证对象 [Spring-Boot]

java - 我们可以确保 @beforesuite 在 dataprovider 之前被调用吗?

java - 使用 java API 搜索 Hbase 记录?

python - 匹配两个字符串之间包含第三个字符串的所有内容

PHP:如何使用带有 HTML 净化器的 nl2br() 来保持换行符?

java - 如何在 checkstyle 的 RegexpHeader 中指定带有换行符的可选正则表达式组?

java - 在 JPA 查询中使用 CURRENT_DATE 的示例

regex - Postgres SQL WHERE 子句在模式匹配中包含 'OR'

java - CheckStyle Eclipse 插件无法正确显示标签

java - 正则表达式多行 checkstyle 模块不起作用