2016-11-08 8 views
-2

のいずれかの種類には適用されません。String.replaceAllだから私は何を持っていることは、文字列から、大文字と小文字と数字以外のすべての文字を削除する必要があり、この単純な方法であり、文字

public static String toSimple(String arg) //redurziert einen String auf Buchstaben und ganze Zahlen 
{ 
    String string = arg; 
    int i = 0; 
    while (i < string.length()) 
    { 
     if (((int)string.charAt(i) >= 48 && (int)string.charAt(i) <= 57)||((int)string.charAt(i) >= 65 && (int)string.charAt(i) <= 90)||((int)string.charAt(i) >= 97 && (int)string.charAt(i) <= 121)) 
      i+=1; 
     else 
     { 
      int a = string.length(); 
      string = string.replaceAll(""+string.charAt(i), ""); 

      if (!(string.length() < a)) //Just in case 
      { 
       i+=1; 
      } 
     } 

問題が到達し、文字を与えられたものの、いくつかのケースでstring.replaceAllは何も変わらないということです。私はデバッガでそれをチェックし、明らかなエラーや例外を見つけることができませんでした。私は全体のASCIIテーブルをチェックしなかった、私は問題が '$' 'のために発生することを知っている?と '。' これを解決する方法はありますか?

+0

注 - そう '(int型)string.charAt(I)> = 48'あなたは何を意味するか、それはより多くの明白になりれ、0''' string.charAt(I)> =」のように記述することができます。 ( 'int'へのキャストはどんな場合でも必要ありません)。 –

+0

これは文字列から文字を削除するにはかなり恐ろしい方法です。そして、それは動作しません。文字列 ",,, + a"を試してください。 "+"は削除されません。通常は、StringBuilderの中で、新しいStringを構築するだろうが、あなたはこのようにそれをやっていた場合でも、あなたは二回、文字の前後の文字列を取得するために 'String.substring'を使用すると思います。 –

答えて

2

String.replaceAllは、その最初のパラメータとして正規表現をとります。

$,?および.は、regular expressionsの特殊文字です。

使用String.replace代わりに - これは実際には内部的にあまりにも正規表現を使用していますが、それは正しく文字列をエスケープします。


しかし、あなたはString.replaceAllを使用していることを考えると、あなただけの全体のことを行うために、正規表現を使用することができます。charリテラルではなく、「マジックナンバー」を使用することができることを

return arg.replaceAll("[^A-Za-z0-9]", ""); 
+0

男は、それが「はるかに簡単です:Dのおかげ –

+1

や 'arg.replaceAll( "\\ P {Alnum} +"、 "")' –

+0

@Wiktor確かに。 OPのコードと一致するので、明示的な範囲を提案しました。 –

関連する問題