可能重复:
用空字符串替换所有非字母数字字符
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
情况1
Input : hjdg$h&jk8^i0ssh6
Expect : hjdghjk8i0ssh6
Output : hjdgh&jk8^issh6
Run Code Online (Sandbox Code Playgroud)
案例2
Input : hjdgh&jk8i0ssh6
Expect : hjdghjk8i0ssh6
Output : hjdghjk8i0ssh6
Run Code Online (Sandbox Code Playgroud)
案例3
Input : hjdgh&j&k8i0ssh6
Expect : hjdghjk8i0ssh6
Output : hjdghjki0ssh6
Run Code Online (Sandbox Code Playgroud)
有人请帮我弄明白,我的代码逻辑有什么问题?
Per*_*ror 21
使用[\\W+]或"[^a-zA-Z0-9]"作为正则表达式来匹配任何特殊字符,并使用String.replaceAll(regex,String)将spl charecter替换为空字符串.记住,作为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);
Run Code Online (Sandbox Code Playgroud)
rth*_*sen 14
您可以通过这种方式阅读这些行并安全地替换所有特殊字符.
请记住,如果您使用\\W,则不会替换下划线.
Scanner scan = new Scanner(System.in);
while(scan.hasNextLine()){
System.out.println(scan.nextLine().replaceAll("[^a-zA-Z0-9]", "");
}
Run Code Online (Sandbox Code Playgroud)
您的问题是返回的索引match.start()对应于匹配时出现在原始字符串中的字符的位置;但是,c每次重写字符串时,这些索引都会变得不正确。
解决此问题的最佳方法是使用replaceAll,例如:
System.out.println(c.replaceAll("[^a-zA-Z0-9]", ""));
Run Code Online (Sandbox Code Playgroud)