如何解决 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 {@code (?i)}.
*
* <p> Specifying this flag may impose a slight performance penalty. </p>
*/
public static final int CASE_INSENSITIVE = 0x02;
我想知道如何去掉字符串中的所有非字母。
我有一个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 {@code (?i)}. * * <p> Specifying this flag may impose a slight performance penalty. </p> */ public static final int CASE_INSENSITIVE = 0x02;