HOWTO · Java

Java에서 문자열의 여러 문자 바꾸기

Java 문자열에서 여러 문자를 바꾸는 방법을 알아봅니다. 정규식에 사용하는 replaceAll(), 리터럴 문자열을 위한 replace(), 첫 번째 일치 항목만 바꾸는 replaceFirst()를 비교합니다.

이 페이지의 내용

Java에서 문자열의 여러 문자를 모두 바꾸려면 정규식 문자 클래스를 사용해 String.replaceAll()을 호출하면 됩니다. 정규식이 필요 없는 리터럴 치환은 String.replace() 호출을 연결해 처리할 수 있습니다. 정규식에서 처음 일치하는 항목만 바꾸려면 String.replaceFirst()를 사용하세요.

Java에서replaceAll()을 사용하여 문자열의 여러 문자 바꾸기

String.replaceAll(regex, replacement)의 첫 번째 인수는 정규식이며, 메서드는 일치하는 항목을 모두 바꿉니다. 예를 들어 문자 클래스 [_/]는 밑줄 하나 또는 슬래시 하나에 각각 일치합니다. 두 문자의 조합인 _/에 일치하는 것은 아닙니다.

다음 프로그램은 밑줄과 슬래시를 하이픈으로 바꾼 뒤 원본과 결과 문자열을 출력합니다.

public class ReplaceAllChars {
  public static void main(String[] args) {
    String input = "j_u_s_t/a/s/t/r/i/n/g";
    String result = input.replaceAll("[_/]", "-");
    System.out.println("Input: " + input);
    System.out.println("Result: " + result);
  }
}
Input: j_u_s_t/a/s/t/r/i/n/g
Result: j-u-s-t-a-s-t-r-i-n-g

Java 문자열 리터럴에서 정규식에 전달할 백슬래시를 쓰려면 백슬래시를 한 번 더 이스케이프해야 합니다. 예를 들어 "\\d"는 정규식 \d를 전달하며, 이 패턴은 숫자 하나에 일치합니다. 일치 항목을 ""로 바꾸면 해당 항목이 제거됩니다. 따라서 "abcd12345efgh".replaceAll("\\d", "")는 숫자를 제거하고, "s t r i n g".replaceAll(" ", "")는 일반 공백을 제거합니다. "s t\\tr".replaceAll("\\s", "-")는 공백과 탭을 포함한 정규식 공백 문자를 하이픈으로 바꿉니다.

위 표현식은 각각 숫자 제거, 일반 공백 제거, 정규식 공백 문자(공백 및 탭 포함)의 하이픈 치환에 사용됩니다. 소문자 ASCII 문자만 제거하려면 [a-z]를 사용하세요. Java에서 \p{Lower}는 기본적으로 ASCII 소문자를 뜻하며, 유니코드 문자 클래스 동작을 활성화한 경우에만 유니코드 소문자도 포함합니다.

Java에서String.replace()를 사용하여 문자열의 여러 문자 바꾸기

String.replace(target, replacement)는 정규식이 아닌 리터럴 문자 시퀀스를 찾습니다. 한 번 호출하면 target의 모든 출현을 바꾸고 새 문자열을 반환합니다. Java 문자열은 불변이므로 원래 문자열 자체는 바뀌지 않습니다. 각 대상에 서로 다른 치환 규칙을 적용할 때 호출을 연결하면 편리합니다. 호출은 왼쪽에서 오른쪽으로 실행되므로 앞선 치환이 만든 문자열을 뒤의 호출이 다시 대상으로 삼을 수도 있습니다.

예를 들어 "javbjavcjadakavajavc"에서 시작해 input.replace("b", "a").replace("c", "a").replace("d", "v").replace("k", "j")와 같이 연결하면 각 문자를 지정한 순서대로 바꿉니다. 대상이 정규식이 아닌 리터럴이고 규칙마다 별도 호출하는 편이 명확하다면 replace()를 선택하세요. 여러 문자를 하나의 정규식 패턴으로 표현할 수 있다면 replaceAll()을 사용할 수 있습니다.

Java에서 문자열의 여러 문자를 String.replaceFirst()로 바꾸기

String.replaceFirst(regex, replacement)도 정규식을 받지만, 호출할 때마다 처음 일치하는 항목 하나만 바꿉니다. 호출을 반복하면 앞선 호출이 반환한 문자열에서 다음 정규식 검색이 시작됩니다. 변경 횟수와 순서를 의도적으로 정해야 하는 경우에 유용할 수 있습니다.

예를 들어 "This is a sample string.".replaceFirst("i", "1").replaceFirst("s", "2")는 먼저 This의 i를 바꾼 다음, 갱신된 문자열에서 처음 나오는 s를 바꿉니다. 두 번째 호출에서 바뀌는 문자는 This의 s입니다. 첫 번째 일치 항목만 바꿔야 할 때는 replaceFirst()를 사용하고, 모든 일치 항목을 바꿔야 할 때는 replaceAll()을 사용하세요.

결론

선택한 여러 문자를 모두 바꾸려면 정규식 문자 클래스와 String.replaceAll()을 사용하세요. 리터럴 치환 규칙이 여러 개라면 String.replace() 호출을 연결하고, 각 호출에서 정규식의 첫 번째 일치 항목만 바꾸려면 String.replaceFirst()를 선택하면 됩니다.