如何解决 SonarQube 对我的代码的投诉?

How to solve SonarQube complaints about my code?

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

我有一个String s,里面可以有很多非字母字符。例如,space、点、斜杠和任何其他不属于 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 抱怨:

Refactor this code to use a "static final" Pattern.

Replace these character ranges with Unicode-aware character classes.

我怎样才能达到同样的效果(乘坐任何非字母表),同时让 SonarQube 非常开心?

尝试使用此版本:

// 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 版本。

改为

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.3433C3.~&%@#43x");
        System.out.println("My prefer string: " + myPreferString);

        String myPreferStringOld = getGoodStringOld("d35545.3433C3.~&%@#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-aware versions of character classes should be preferred

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

Regex patterns should not be created needlessly

(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;