Java の replace() と replaceAll()、ついでに StringUtils#replaceOnce()
String#replace()
は正規表現を使わない。String#replaceAll()
は引数を正規表現として扱う。
/* 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つずつ置換してブチ込んでいったりする時に使うことが多いかも。