質問: Aizu Onlineジャッジの問題で、単語W、複数行にまたがった文章(END_OF_TEXTまで)が与えられており、文章のうち単語Wに一致するものの個数を出力せよ、という問題があるのですが、解けません。 以下のように`replaceAll`を使って解こうと思ったのですが、 `text=text.replaceAll(".", " ");` では`.`が取り除けていないのか、textが空行になってしまいます。 どこが間違っているのでしょうか。 ``` import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class test{ public static void main(String[] args){ BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); try{ String W=reader.readLine().toLowerCase(); String text=""; while(true){ String p=reader.readLine(); if(p.equals("END_OF_TEXT"))break; text+=p.toLowerCase(); } System.out.println(text); text=text.replaceAll(".", " "); System.out.println(text); String[] array_text=text.split(" "); int count=0; for(int i=0;i
回答: `replaceAll` の最初の引数は正規表現パターンを指定します。 `.`(ピリオド)は、一文字を表すパターンですのでピリオドの文字自体を表す場合には(パターンの指定ではないと報せて)エスケープさせる必要があります。 それには、ピリオドの前にエスケープ文字`\`(日本では円記号)を置きます。 この場合`"."`を`"\\."`のようにします。 2重に指定するのは文字列中の`\`(が特別な機能(文字列中でのエスケープ)を有する)をエスケープさせるためです。 `"\\."`は、`\.`の文字列として解釈されます。それが、(ピリオド自体を表す)パターンとして渡されます。