본문 바로가기

Programming/Java

[Java] String.replaceAll() 활용하기

자바에서 replaceAll(regex, replacement)는 문자열에서 정규식과 일치하는 문자열을 찾아 replacement로 바꾸어주는 메소드이다.

replaceAll()은 내부적으로 Matcher.appendReplacement()를 사용하는데 Matcher에서 사용했던 것과 유사하게 그룹핑을 통해 일치하는 문자열을 골라 커스텀이 가능하다. ([Java] Pattern, Matcher Class 사용법과 메소드 정리)

 

 

System.out.println("abcdefg".replaceAll("\\w", "*"));

// *******

기본적으로 사용하면 String.replaceAll()을 사용한다면 위와 같은 형태로 출력이 가능하다.

주어진 \\w과 일치하는 문자열을 모두 찾아 *로 변환하는 것이다. 하지만 검색된 문자열을 사용하고 싶다면 달러 기호($)를 사용하면 된다.

 

달러 기호는 Matcher.group()과 유사한데, 기호 뒤에 등장하는 값이 메소드의 파라미터와 같다고 생각하면 이해하기 편하다.

 

 

System.out.println("a1b2c3d4".replaceAll("[a-z]","($0)"));

// (a)1(b)2(c)3(d)4

만약 알파벳마다 괄호를 적용하고 싶다면 $0를 사용하면 되는데 이것은 Matcher.group(0), 즉 일치하는 모든 그룹의 문자열을 가져온다. 그렇게 받아온 문자열을 사용해 원하는대로 변경이 가능해진다.

 

 

또한 그룹핑도 가능한데, naming 방식과 index 방식을 모두 지원한다.

System.out.println("01012345678".replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1-$2-$3"));

// 010-1234-5678

$gg번째 그룹을 가져오게 되고 차례로 숫자 3개, 숫자 4개, 숫자 4개에 해당하는 그룹을 가지게 된다.

 

 

System.out.println("20210101".replaceAll("(?<year>\\d{4})(?<month>\\d{2})(?<day>\\d{2})",
                                  "${year}년 ${month}월 ${day}일"));

// 2021년 01월 01일

${name}을 통해 네이밍으로 그룹핑된 문자열을 직관적이게 가져올 수도 있다.

 

만약 달러 기호를 그대로 사용하고 싶다면 \\$를 사용하면 된다.

 

 

 

'Programming > Java' 카테고리의 다른 글

[Java] 병렬 데이터 처리(병렬 스트림, 포크/조인 프레임워크)  (0) 2021.05.21
[Java] 스트림(Stream) 활용  (0) 2021.05.13
[Java] 스트림(Stream)  (0) 2021.05.11
[Java] 람다(lambda)  (0) 2021.05.06
[Java] Boxing, Unboxing  (0) 2021.05.05