Java 如何解决对我的代码的投诉?
我想知道如何去掉字符串中所有的非字母 我有一个字符串s,其中可以包含许多非字母字符。例如,空格,点,斜线,以及任何其他不是来自a,b,c的疯狂的东西。。。而不是从A,B,C。。。Z 我只想保留那些a,b,c。。。z和A,B,C。。。Z 因此,我写道:Java 如何解决对我的代码的投诉?,java,sonarqube,Java,Sonarqube,我想知道如何去掉字符串中所有的非字母 我有一个字符串s,其中可以包含许多非字母字符。例如,空格,点,斜线,以及任何其他不是来自a,b,c的疯狂的东西。。。而不是从A,B,C。。。Z 我只想保留那些a,b,c。。。z和A,B,C。。。Z 因此,我写道: private static String getGoodString(String s) { return s.replaceAll("[^a-zA-Z]", ""); } 这真的很有效,很开心
private static String getGoodString(String s) {
return s.replaceAll("[^a-zA-Z]", "");
}
这真的很有效,很开心
然而,SonarQube抱怨:
重构此代码以使用“静态最终”模式
用支持Unicode的字符类替换这些字符范围
我怎样才能达到同样的效果(使用任何非字母表),同时又能让你感到非常高兴呢?请尝试使用此版本:
//在您的类中
私有静态最终模式p=Pattern.compile(“[^\\p{Alpha}]”);
私有静态字符串getGoodString(字符串s){
返回p.matcher.replaceAll(“”);
}
这里我使用的是静态final模式
。此外,regex\p{Alpha}
是用于匹配任何字母字符的Unicode版本。更改为
private static final Pattern regexpatern=Pattern.compile(“[^\\p{Alpha}]”,Pattern.CASE\u不区分大小写);
私有静态字符串getGoodString(字符串s){
返回regexpatern.matcher.replaceAll(“”);
}
package.com公司;
导入java.util.regex.Pattern;
公共班机{
私有静态最终模式regexpatern=Pattern.compile(“[^\\p{Alpha}]”,Pattern.CASE\u不区分大小写);
公共静态void main(字符串[]args){
字符串myPreferString=getGoodString(“d35545.343\343C3.~&%@#43x”);
System.out.println(“我的首选字符串:+myPreferString”);
字符串myPreferStringOld=getGoodStringOld(“d35545.343\343C3.~&%@#43x”);
System.out.println(“我的首选字符串(oldway):”+myPreferStringOld);
}
私有静态字符串getGoodString(字符串s){
返回regexpatern.matcher.replaceAll(“”);
}
私有静态字符串getGoodStringOld(字符串s){
返回s.replaceAll(“[^a-zA-Z]”,即“”);
}
}
(1)
应首选支持Unicode的字符类版本
(2)
不应不必要地创建正则表达式模式
(3)Javadoc
/**
*启用不区分大小写的匹配。
*
*默认情况下,不区分大小写的匹配假定只有字符
*在US-ASCII字符集中,正在进行匹配。支持Unicode
*通过指定{@link,可以启用不区分大小写的匹配
*#UNICODE_CASE}标志与此标志一起使用。
*
*也可以通过嵌入标志启用不区分大小写的匹配
*表达式{@code(?i)}。
*
*指定此标志可能会造成轻微的性能损失
*/
公共静态final int不区分大小写=0x02;
\p{Alpha}
与[a-zA-Z]
相同,例如,对于字符串,Häuser123
,此代码将输出Huser
而不是预期的字符串,Häuser
@ArvindKumarAvinash请重新阅读OP,特别注意SonarQube投诉:将这些字符范围替换为支持Unicode的字符类。
是,这就是我在我的评论@ArvindKumarAvinash中提到的OP不需要unicode感知类,这是SonarQube建议的,但这不符合他们的要求。那Häuser123
应该会导致Häuser
是您提出的要求,因为它不是从问题开始的。@ArvindKumarAvinash和我重复:\p{Alpha}
是OP想要的,所以如果这还不足以关闭声纳,那么OP将需要添加一个抑制。您将不得不接受它。在你调整之前,没有办法让你对你的案子感到满意。非常感谢@NVy的回答,非常感谢。不幸的是,它现在产生了“启用”UNICODE_字符_类”标志或使用UNICODE感知的替代方案
/**
* 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;