Java の replace() と replaceAll()、ついでに StringUtils#replaceOnce()

/* replace() : 正規表現未使用 */
String src = "hoge?fuga.";
String dest = src.replace(".", "-");
// dest => "hoge?fuga."

/* replaceAll() : 正規表現で処理 */
String src = "hoge?fuga";
String dest = src.replaceAll(".", "-");
// dest => "----------"

うっかり src.replaceAll("?", "変換文字") と書いて PatternSyntaxException とかやらかしがち…。str.replaceAll("\\?", "変換文字") というように、エスケープしてやれば良いが、基本は str.replace("?", "変換文字") と、正規表現として扱わない方を使えば良い。

んで、Apache Commons Lang の StringUtils には replaceOnce() というメソッドもあって、これは replace() (正規表現未使用) の置換を1回だけ行うもの。

String src = "SELECT * FROM table WHERE age = ? AND count = ?";
String dest = StringUtils.replaceOnce(src, "?", "20");
// dest => "SELECT * FROM table WHERE age = 20 AND count = ?"

SQL 文の ? に対応するパラメータを while 文で1つずつ置換してブチ込んでいったりする時に使うことが多いかも。