以下の冗長なコードを同等の処理で高速になるように書きたいです。
replaceAllが6回呼ばれていますが、1回にすることはできますか?
Java
1 String str = "a\\\\r\\\\f\\\\b\\\\n\\\\t\\\\\"b"; 2 String replaced = str.replaceAll("\\\\r", "\r").replaceAll("\\\\f", "\f").replaceAll("\\\\b", "\b").replaceAll("\\\\n", "\n").replaceAll("\\\\t", "\t").replaceAll("\\\\\"", "\""); 3 System.out.println(replaced);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
stackoverflow の以下の回答を参考にすると、
http://stackoverflow.com/a/7661573/6299234
以下のようになるでしょうか?
java
1String str = "a\\\\r\\\\f\\\\b\\\\n\\\\t\\\\\"b"; 2 3Map<String, String> replacements = new HashMap<String, String>() { 4 { 5 put("\\r", "\r"); 6 put("\\f", "\f"); 7 put("\\b", "\b"); 8 put("\\n", "\n"); 9 put("\\t", "\t"); 10 put("\\\"", "\""); 11 } 12}; 13 14String regexp = "\\\\r|\\\\f|\\\\r|\\\\b|\\\\n|\\\\t|\\\\\""; 15 16StringBuffer sb = new StringBuffer(); 17Pattern p = Pattern.compile(regexp); 18Matcher m = p.matcher(str); 19 20while (m.find()) { 21 m.appendReplacement(sb, replacements.get(m.group())); 22} 23 24m.appendTail(sb); 25 26System.out.println(sb.toString());
https://paiza.io/projects/EuCH4j-vlmh-3w7ygwm2tQ
一応、正規表現によるパターンマッチングは1回だけの実行となっていますが、
これで処理が高速になるかは不明です。
追記
今回のケースに限って言うと、replaceAll を replace に置き換えると高速化が期待できそうです。
https://paiza.io/projects/GjupaAu7dhuL51lKxitOzQ
replaceAll と異なり、replace は正規表現を使用しない文字列置換であるためです。
[http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replace(java.lang.CharSequence, java.lang.CharSequence)](http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replace(java.lang.CharSequence, java.lang.CharSequence))
投稿2017/02/20 06:12
編集2017/02/21 02:49総合スコア4791
0
訂正2:自分の回答は間違いです!
設問を勘違いしていました。\\r
などの3文字を1つの制御文字('\r'='\u000D'など)に置き換える問題なのですね。おわかりと思いますが、自分は'\'+'r'に置き換えるものと勘違いして回答してました。
String#replaceAllは正規表現が使えるので
String replaced = str.replaceAll("\\\\\\\\([rfbnt\\\\])", "\\\\$1");
でどうでしょう。質問の例でいえば結果は(エスケープなしに書くと)
a\r\f\b\n\t\\"b
になります。
訂正1:
コメントみて気づきました。ご質問のコードの最後のパターンは
\" -> "
なのですね。自分は
\ ->
と勘違いして回答してました。その点を訂正しておきます。
String replaced = str.replaceAll("\\\\\\\\([rfbnt\"])", "\\\\$1");
投稿2017/02/19 09:05
編集2017/02/20 08:09総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/19 14:21
2017/02/20 08:11
2017/02/20 11:43
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/20 08:10
2017/02/20 11:44
2017/02/21 02:14
2017/02/21 02:19
2017/02/21 03:11 編集
2017/02/21 03:13 編集
2017/02/21 03:45
2017/02/21 04:14
2017/02/23 11:45
2017/02/23 13:52
2017/02/23 14:26
2017/02/23 15:00 編集
2017/02/24 04:08 編集
2017/02/26 05:15