반응형
String을 replace() 해야할 때 File.separator를 사용할 때 character to be escaped is missing 메세지를 볼 수 있을 것이다. 아마도 윈도우 환경에서만 발생할 것이고, 원인은 File.separator가 '\'를 반환하는데 \가 escape문자이기 때문에 발생한다. 예를 들면 \를 문자로 사용하기 위해서는 \\, /를 쓰기 위해서는 \/ 이런식으로 특수문자를 쓰는데 사용되는 문자인데 \만 단독으로 사용되니 문제가 발생하는 것이다.
근데 에러 메세지도 그렇고 내부를 찾아봐도
if (nextChar == '\\') {
cursor++;
if (cursor == replacement.length())
throw new IllegalArgumentException(
"character to be escaped is missing");
nextChar = replacement.charAt(cursor);
result.append(nextChar);
cursor++;
}
친절하지 않다.
해결방법은 Matcher 클래스의 quoteReplacement(String s)를 활용하면 된다.
위 함수의 내부 동작은 아래와 같다.
public static String quoteReplacement(String s) {
if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
return s;
StringBuilder sb = new StringBuilder();
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
if (c == '\\' || c == '$') {
sb.append('\\');
}
sb.append(c);
}
return sb.toString();
}
\\가 없으면 s를 그대로 반환하고, 있을 경우 StringBuilder()를 이용해 다시 문자열을 만든 뒤 toString()해서 리턴한다.
핵심은 StringBuilder인듯... 왜 builder를 쓰면 문제가 해결되는지까지는 알아보지 않았다.
어쨋든, replace()의 replacement 파라미터를 Matcher.quoteReplacement(File.separator) 이렇게 넣어주면 문제 해결!
반응형
댓글