regex SonarQube问题:删除此字符类中的重复项

6ojccjat  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(307)

我已经实现了regex表达式来删除所有带有空字符串的特殊字符并删除空格(如果有),这在我的代码中运行良好,但sonarQUbe抱怨这是不兼容的解决方案,有人能告诉我如何解决这个问题吗

String c = "test10101010test%79%% %%% $$$  \t \n $$$#$@^$%~`***c  33";
    Pattern pt = Pattern.compile("[\\W\\s+]");
    Matcher match= pt.matcher(c);
    while(match.find())
    {
        c=c.replaceAll("\\"+match.group(), "").toLowerCase();
    }
     System.out.println(c);

我在"[\\W\\s+]"得到错误。得到下面的错误删除重复在这个字符类。
有人能建议如何解决这个问题吗?

axzmvihb

axzmvihb1#

您的正则表达式是一个字符类[...]。它匹配\W(除字母、数字或连接符标点符号(ASCII模式中的下划线)以外的字符)、\s(空白)和+字符。您得到的错误与+和空白字符都可以与\W匹配这一事实有关。
因此,您的模式基本上是\W。注意,它不匹配标点字符下划线。如果您想删除除字母数字字符以外的所有字符,请使用[\W_]\P{Alnum}模式。
此外,您通常不需要在更换前检查是否匹配,以下应该足够了:

c=c.replaceAll("\\W+", "").toLowerCase();
// or
c=c.replaceAll("[\\W_]+", "").toLowerCase();
// or
c=c.replaceAll("\\P{Alnum}+", "").toLowerCase();

注意如果您指定了不区分大小写的标志/i,并使用字符类来匹配两种大小写的字母,如[zZ]/[zZ]/i),则会出现此警告。很明显,您需要在此处用单个字母zZ替换字符类。

ssm49v7z

ssm49v7z2#

正如Wiktor Stribizew在评论部分提到的,解决SonarQube问题的方法是

String c = "test10101010test%79%% %%% $$$  \t \n $$$#$@^$%~`***c  33";
Pattern pt = Pattern.compile("\\P{Alnum}");
Matcher match= pt.matcher(c);
while(match.find())
{
    c=c.replaceAll("\\"+match.group(), "").toLowerCase();
}
 System.out.println(c);

相关问题