2016-04-13 12 views
0
String random = "{\"url\":\"api.github.com/repos/SparkTC/stocator/issues/comments/206712399\",\"html_url\":\"github.com/SparkTC/stocator/issues/22#issuecomment-206712399\""; 
System.out.println(random.replaceAll("\\\"", "")); 

Output: {"url":"api.github.com/repos/SparkTC/stocator/issues/comments/206712399","html_url":"github.com/SparkTC/stocator/issues/22#issuecomment-206712399" 

ただし、ファイル内のコンテンツが同じで、次のコードを使用しても何も変わりません。JavaのreplaceAll()で奇妙な問題が発生しました。

File file = new File("/Users/ayacs/Desktop/example.json"); 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line = "", oldtext = ""; 
     while ((line = reader.readLine()) != null) { 
      oldtext += line + "\r\n"; 
     } 
     reader.close(); 

     String newtext = oldtext.replaceAll("\\\"", "\""); 
     System.out.println(oldtext); 
     System.out.println(newtext); 
     FileWriter writer = new FileWriter("/Users/ayacs/Desktop/example.json"); 
     writer.write(newtext); 
     writer.close(); 

と出力はファイルの内容と同じである:

{\"url\":\"api.github.com/repos/SparkTC/stocator/issues/comments/206712399\",\"html_url\":\"github.com/SparkTC/stocator/issues/22#issuecomment-206712399\" 

私は私のファイルに\を削除するといくつかの問題を抱えていると思います。私は他のreplaceAllの問題も調べてみたが、私の場合は役に立たなかった。

+0

しないでください。あなたはJSONパーサを使うべきです。 – SLaks

+0

実際には文字列エスケープを見ているように思えますが、問題はありません。 – SLaks

+2

なぜ '.replace()'ではなく '.replaceAll()'を使用しますか?ここには正規表現は必要ありません。 –

答えて

1

replace("\\\"", "\"")の代わりに書く必要があります。

メソッドreplaceAll()は、最初の引数として正規表現パターンを使用し、2番目の引数として正規表現置換を使用します。メソッドreplace()は、2つのプレーンストリングを取り、解釈を適用しません。

replaceAll("\\\"", "\"")を呼び出すと、プログラムは正規表現文字列\"を使用して、文字列を"に置き換えます。しかし正規表現の文字列\"は単に効果がない二重引用符をエスケープしているので"を意味します。実際にreplaceAll()を使って仕事をしたければ、replaceAll("\\\\\"", "\"")と書いてください。しかし、これは不必要に複雑なので、代わりに単にreplace()メソッドを使用してください。

+0

私はJSONパーサを選択したでしょう – JavaHopper

+0

多くの人が 'replace()'が最初のオカレンスだけを置き換えると思う人がいます。これは、正規表現ベースのメソッド 'replaceAll()'の名前をつけるためにひどく悪い選択です... –

+0

@SashaSalauyouこれは 'replaceFirst()'になります。 – Nayuki

関連する問題