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+]またはを正規表現として使用"[^a-zA-Z0-9]"して特殊文字と一致させ、String.replaceAll(regex、String)を使用してspl文字を空の文字列に置き換えます。String.replaceAllの最初の引数は正規表現であるため、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 に答える