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

案例3

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

任何人都请帮我弄清楚,我的代码逻辑有什么问题?

4

3 回答 3

25

使用[\\W+]or"[^a-zA-Z0-9]"作为正则表达式来匹配任何特殊字符,还使用 ​​String.replaceAll(regex, String) 将 spl 字符替换为空字符串。请记住,String.replaceAll 的第一个 arg 是一个正则表达式,您必须使用反斜杠对其进行转义才能将 em 视为文字字符。

          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);
于 2013-01-16T15:18:02.783 回答
16

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

Scanner scan = new Scanner(System.in);

while(scan.hasNextLine()){
    System.out.println(scan.nextLine().replaceAll("[^a-zA-Z0-9]", ""));
}
于 2013-01-16T15:17:42.480 回答
6

您的问题是返回的索引match.start()对应于匹配时原始字符串中出现的字符位置;c但是,当您每次都重写字符串时,这些索引会变得不正确。

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

        System.out.println(c.replaceAll("[^a-zA-Z0-9]", ""));
于 2013-01-16T15:21:36.747 回答