【问题标题】:How to solve SonarQube complaints about my code?如何解决 SonarQube 对我的代码的投诉?
【发布时间】:2021-02-28 06:45:26
【问题描述】:

我想知道如何去掉字符串中的所有非字母。

我有一个 String ,其中可以包含许多非字母字符。例如,空格、点、斜线和任何其他不来自 a、b、c ... z 和不来自 A、B、C ... Z 的疯狂东西。

我只想保留那些 a, b, c ... z 和 A, B, C ... Z。

因此,我写道:

private static String getGoodString(String s) {
    return s.replaceAll("[^a-zA-Z]", "");
}

这确实有效,很高兴。

但是,SonarQube 抱怨:

重构此代码以使用“静态最终”模式。

用支持 Unicode 的字符类替换这些字符范围。

我怎样才能达到同样的效果(获得任何非字母表),同时让 SonarQube 非常高兴?

【问题讨论】:

  • 你将不得不忍受它。除非您调整 rule,否则无法让 SonarQube 对您的案例感到满意。

标签: java sonarqube


【解决方案1】:

尝试使用这个版本:

// inside your class
private static final Pattern p = Pattern.compile("[^\\p{Alpha}]");

private static String getGoodString(String s) {
    return p.matcher(s).replaceAll("");
}

这里我使用了一个静态的 final Pattern。此外,正则表达式 \p{Alpha} 是匹配任何字母字符的 Unicode 版本。

【讨论】:

  • \p{Alpha}[a-zA-Z] 相同,例如对于字符串Häuser123!,此代码将输出Huser,而不是预期的字符串Häuser
  • @ArvindKumarAvinash 请重新阅读 OP,特别注意 SonarQube 投诉:Replace these character ranges with Unicode-aware character classes.
  • 是的,这就是我在评论中提到的内容?。 \p{Alpha}[a-zA-Z] 相同,并且不是可识别 Unicode 的字符类。
  • @ArvindKumarAvinash OP 不想要一个识别 unicode 的类,这就是 SonarQube 的建议,但这不符合他们的要求。 Häuser123! 应该导致 Häuser 是您提出的要求,因为它没有从问题中得出。
  • @ArvindKumarAvinash 我重复一遍:\p{Alpha} 是 OP 想要的,所以如果这还不足以关闭声纳,那么 OP 将需要添加抑制.
【解决方案2】:

改成

private static final Pattern regexPattern = Pattern.compile("[^\\p{Alpha}]", Pattern.CASE_INSENSITIVE);

private static String getGoodString(String s) {
    return regexPattern.matcher(s).replaceAll("");
}
package com.company;

import java.util.regex.Pattern;

public class Main {

    private static final Pattern regexPattern = Pattern.compile("[^\\p{Alpha}]", Pattern.CASE_INSENSITIVE);

    public static void main(String[] args) {
        String myPreferString = getGoodString("d35545.343\343C3.~&%@#43x");
        System.out.println("My prefer string: " + myPreferString);

        String myPreferStringOld = getGoodStringOld("d35545.343\343C3.~&%@#43x");
        System.out.println("My prefer string (oldway): " + myPreferStringOld);
    }

    private static String getGoodString(String s) {
        return regexPattern.matcher(s).replaceAll("");
    }

    private static String getGoodStringOld(String s) {
        return s.replaceAll("[^a-zA-Z]", "");
    }
}

(1) https://rules.sonarsource.com/java/RSPEC-5867

应首选支持 Unicode 的字符类版本

(2) https://rules.sonarsource.com/java/tag/regex/RSPEC-4248

不应不必要地创建正则表达式模式

(3) Javadoc

/**
 * Enables case-insensitive matching.
 *
 * <p> By default, case-insensitive matching assumes that only characters
 * in the US-ASCII charset are being matched.  Unicode-aware
 * case-insensitive matching can be enabled by specifying the {@link
 * #UNICODE_CASE} flag in conjunction with this flag.
 *
 * <p> Case-insensitive matching can also be enabled via the embedded flag
 * expression&nbsp;{@code (?i)}.
 *
 * <p> Specifying this flag may impose a slight performance penalty.  </p>
 */
public static final int CASE_INSENSITIVE = 0x02;

【讨论】:

  • 非常感谢@NVy 的回答,非常感谢。不幸的是,它现在产生“启用“UNICODE_CHARACTER_CLASS”标志或使用可识别 Unicode 的替代方案。”
猜你喜欢
  • 2019-08-29
  • 2020-12-25
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多