본문 바로가기
Java & Kotlin/Java

[Java] replaceAll, replaceFirst 에서 특수문자 인식하기

by heekng 2022. 6. 24.
반응형

replaceAll, replaceFirst 에서 특수문자 인식하기

개발 도중 url 의 가장 첫 . 앞에 특정한 문자를 추가해야하는 상황이 생겼다.

@Test
void javaReplaceDotTest() throws Exception {
    String url = "aaa.bbb.ccc.ddd";

    String replaceUrl = url.replaceFirst(".", "gg");

    Assertions.assertThat(replaceUrl).isEqualTo("aaaggbbb.ccc.ddd");
}

위와 같이 내가 의도한 상황은 aaaggbbb.ccc.ddd이지만

위와 같은 결과가 나타났다.

이는 replace와 replaceAll, replaceFirst의 매개변수 차이로 인해 나타나는 현상이다.

replace는 char 또는 CharSequence를 인자로 받지만, replaceFirst와 replaceAll은 정규표현식형태로 인자를 받는다.
regex에서 .은 어떤 문자 하나를 뜻하기 때문에 위 상황에서는 첫 .문자를 찾는 것이 아닌 url의 첫번째 문자인 agg로 변경한 것이다.

해결방법은?

@Test
void javaReplaceDotTest2() throws Exception {
    String url = "aaa.bbb.ccc.ddd";

    String replaceUrl = url.replaceFirst("[.]", "gg");

    System.out.println("replaceUrl = " + replaceUrl);
    Assertions.assertThat(replaceUrl).isEqualTo("aaaggbbb.ccc.ddd");
}

나의 경우 이러한 정규표현식에 특수문자를 입력해야 하는 상황에 []으로 해당 특수문자를 감싸는 형태로 해결한다.

[]으로 해당 특수문자를 감싸게 된다면 java 내에서 해당 문자를 일반 문자로 취급하여 의도한 대로 replaceAll, replaceFirst를 수행하게 된다.

반응형