본문 바로가기
Java

replace()에서 replacement parameter로 File.separator를 사용할 때 character to be escaped is missing

by 루에 2019. 7. 29.
반응형

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) 이렇게 넣어주면 문제 해결!

반응형

댓글