2016-09-04 4 views
-1

でReplaceAllは、次のコードの間違った出力を与えている間違った出力を与える: -JavaででReplaceAllは

package javaapplication3; 

public class JavaApplication3 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      String sa = "LTD."; 
      sa = sa.replaceAll("L.","LE"); 
      sa = sa.replaceAll("LTD.","LTD&#8901"); 
      System.out.println(sa); 
     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
     } 
    } 

} 

出力は次のようになります。LTD &#8901

しかし、出力が表示されます:LEDを。

+0

ReplaceAllは正規表現を使用します。 。任意の文字なので、エラーはありません。設計どおりに動作します。正規表現が必要ない場合はreplaceFirstを使用できます – YMomb

答えて

0

replaceAllは最初の引数として正規表現をとります。正規表現では、.は任意の1文字と一致するため、最初のreplaceAll文ではLTLEに置き換えられます。これは.\\でエスケープすることで解決できます。 Javaの正規表現の

sa = sa.replaceAll("L\\.","LE"); 
sa = sa.replaceAll("LTD\\.","LTD&#8901"); 

さらに詳しい情報:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

このコードhereをコンパイルして実行します。

+0

downvoteの理由は何ですか?この回答はうまくいくはずです。 – js441

2

出力は大丈夫です。

public static void main(String[] args) { 
    String sa = "LTD."; 
    sa = sa.replaceAll("L.", "LE"); // in regex . means any single character. So, "LT" is replaced. "LTD." is now "LED." 
    sa = sa.replaceAll("LTD.", "LTD&#8901"); // "LED." doesn't have "LTD.". so no replace 
    System.out.println(sa); // output "LED." 
} 

代わりにreplace()を使用してください。

public static void main(String[] args) { 
    String sa = "LTD."; 
    sa = sa.replace("L.", "LE"); 
    sa = sa.replace("LTD.", "LTD&#8901"); 
    System.out.println(sa); 
} 
+0

これは動作しません。 replaceは文字列ではなくcharをとる。文字列を置き換える場合は、replaceAllを使用して正規表現を適切にフォーマットする必要があります。 – js441

+1

@ js441オーバーロードされた 'replace'メソッドはほとんどありません。あなたが言及したように 'replace(char、char)'がありますが、regex構文を自動的にエスケープする 'replaceAll(String、String)'の基本的なバージョンである 'replace(String、String)'もあります。 – Pshemo

+1

@Pshemoは、置換(CharSequence、CharSequence)があることを認識しました。文字列リテラルから暗黙的に作成することができます。したがって、replace(String、String)が動作します。 – js441

関連する問題