Java中去除所有特殊字符

11

可能重复的问题:
用空字符串替换所有非字母数字字符

import java.util.Scanner;
import java.util.regex.*;
public class io{
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
String c;
if((c=scan.nextLine())!=null)
 {
Pattern pt = Pattern.compile("[^a-zA-Z0-9]");
Matcher match= pt.matcher(c);
    while(match.find()){
         c=c.replace(Character.toString(c.charAt(match.start())),"");
         }
    System.out.println(c);
      }
   }
}

案例1

Input : hjdg$h&jk8^i0ssh6
Expect : hjdghjk8i0ssh6
Output : hjdgh&jk8^issh6

案例2

Input : hjdgh&jk8i0ssh6
Expect : hjdghjk8i0ssh6
Output : hjdghjk8i0ssh6

案例三

Input : hjdgh&j&k8i0ssh6
Expect : hjdghjk8i0ssh6
Output : hjdghjki0ssh6

请帮我找出代码逻辑的问题,谢谢!


2
在提交问题之前,请考虑查看Java命名约定并格式化您的源代码。 - rtheunissen
2
Try [^a-z$]|[^A-Z$]|[^0-9$] - noMAD
2
@var___ 为什么你要在记事本里写代码呢? - Kakalokia
3
它在记事本里并不意味着你不能用Tab进行缩进。 :p - rtheunissen
1
@paranoid-android 我尽力了。 - Ravi
显示剩余4条评论
3个回答

25

使用正则表达式[\\W+]"[^a-zA-Z0-9]"来匹配任何特殊字符,并使用String.replaceAll(regex, String)将特殊字符替换为空字符串。请注意,String.replaceAll的第一个参数是一个正则表达式,因此您必须使用反斜杠进行转义,以将其视为字面字符。

          String c= "hjdg$h&jk8^i0ssh6";
        Pattern pt = Pattern.compile("[^a-zA-Z0-9]");
        Matcher match= pt.matcher(c);
        while(match.find())
        {
            String s= match.group();
        c=c.replaceAll("\\"+s, "");
        }
        System.out.println(c);

c=c.replace(match.group(), ""); 这个也可以工作。为什么? - Ravi
请注意,我使用的是replaceAll函数,它将第一个参数作为正则表达式,而您使用的是不带正则表达式的replace函数,因此它可以正常工作.. :) - PermGenError
好的,我明白了,谢谢! - Ravi
1
同样的问题,更好的答案:https://dev59.com/CG855IYBdhLWcg3wik-D#4283366 - Mark W
3
这也替换了所有的空格,因此在句子上使用它可能不是一个好主意。 - Vini

17

您可以通过这种方式阅读行并安全地替换所有特殊字符。
请记住,如果您使用\\W,则不会替换下划线。

Scanner scan = new Scanner(System.in);

while(scan.hasNextLine()){
    System.out.println(scan.nextLine().replaceAll("[^a-zA-Z0-9]", ""));
}

如果我想使用 regex 包怎么办? - Ravi
如果这是一个作业,你必须使用 regex 包,那么你可能正在寻找一种不必要的复杂解决方案。为什么你想使用 regex 包呢? - rtheunissen
所以,我可以更多地了解regex包。 - Ravi
在这种情况下,“GanGnaMStYleOverFlowErroR”的答案可能是最好的? - rtheunissen

7

你的问题在于match.start()返回的索引对应于字符在匹配时在原始字符串中出现的位置;然而,由于每次重写字符串c,这些索引变得不正确。

解决这个问题的最佳方法是使用replaceAll,例如:

        System.out.println(c.replaceAll("[^a-zA-Z0-9]", ""));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接