【问题标题】:Regular expression help needed for simple (I think) scenario简单(我认为)场景需要正则表达式帮助
【发布时间】:2011-10-30 09:21:03
【问题描述】:

从不擅长这些事情。我们正在使用 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”时正则表达式应该为真(" 出现,但 "RoundingMode." 没有出现。

提前致谢

【问题讨论】:

    标签: java regex checkstyle


    【解决方案1】:

    您可以使用正则表达式:

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

    See it

    【讨论】:

    • 简洁的链接,但它似乎显示了所有匹配的测试行,而我原本预计只有两个匹配。
    • @CK:这就是网站的运作方式:)。包含该图案的线条以蓝色突出显示。
    • 啊,谢谢,我现在明白了。然后,正则表达式可以工作,除了我需要这个表达式的逆。
    【解决方案2】:

    怎么样:

    \.setScale\(.+RoundingMode
    

    【讨论】:

      【解决方案3】:

      在我的头顶:

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

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

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

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

      【讨论】:

      • 大声笑,“为了可读性”。害怕它仍然是胡言乱语:) +1 以获得很好的解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多